メモ

do
	-- グループクラスを定義する。
	-- グループとは、キャラクターの集合のテーブルである。
	-- フィルタリングメソッドを実行すると、フィルタリングされた結果の新しいグループを返す。
	local class = {} -- 基本メソッド

	-- addメソッド。そのグループにキャラクターを追加する。
	-- 既に所属していると失敗してfalseを返す。成功すればtrueを返す。
	class.add = function(group, chara)
		for i, v in ipairs(group.menber) do
			if v == chara then return false end
		end
		group.menber[1+#group.menber] = chara
		return true
	end
	
	-- removeメソッド。そのグループからキャラクターを除外する。
	-- もともと存在していなければ、失敗してfalseを返す。成功すればtrueを返す。
	class.remove = function(group, chara)
		local new = {}
		local flag = false
		for i, v in ipairs(group.menber) do
			if v == chara then
				flag = true
			else
				new[1+#new] = v
			end
		end
		return flag
	end

	-- filterメソッド。条件を与え、その条件でグループを二つに分ける。
	-- 分けられたグループは、新しいgroupオブジェクトに生成されて返ってくる。
	-- 返り値は二つ、一つ目は与えた条件でtrueになったキャラクター。
	-- 二つ目はその余り。
	class.filter = function(group, method)
		local r1 = {}
		local r2 = {}
		for i, v in ipairs(group.menber) do
			if method(v) then
				r1[1+#r1] = v
			else
				r2[1+#r2] = v
			end
		end
		return group.new(r1), group.new(r2)
	end

	-- countメソッド。そのグループに所属するキャラクターの数を返す。
	class.count = function(group)
		return #group.menber
	end

	local index = {__index=class}

	-- グループを作成するメソッド
	group.new = function(menber)
		local group = setmetatable({}, index)
		group.menber = menber
		group.menber = group.menber or {} -- 実際にキャラクターを格納するキー。
		return group
	end
	
	-- ゲームの要、敵味方場所を問わず全てのキャラクターを入れておくグループ、を返す。
	local all_characters
	group.all = function()
		all_characters = all_characters or group.new()
		return all_characters
	end
	
end