summaryrefslogtreecommitdiffstats
path: root/acf/model/set.lua
blob: 47eeaa8d844aae61e58ec5bd1c14083ba429e120 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
--[[
Copyright (c) 2012-2013 Kaarle Ritvanen
See LICENSE file for license details
--]]

module(..., package.seeall)

local TreeNode = require('acf.model.field').TreeNode
local npairs = require('acf.model.node').pairs
local object = require('acf.object')


Set = object.class(require('acf.model.node').List)

function Set:init(context, params)
   assert(not object.isinstance(params.field, TreeNode))
   object.super(self, Set):init(context, params)

   local function find(value)
      for i, member in npairs(self) do
	 if member == value then return i end
      end
   end

   local mt = getmetatable(self)
   mt.meta.type = 'set'

   function mt.get(k, create) return (create or find(k)) and k end

   function mt.__newindex(t, k, v)
      assert(v == nil)
      local i = find(k)
      if not i then return end
      mt.save(i, nil)
   end

   local insert = mt.insert
   function mt.insert(v) if not find(v) then insert(v) end end
end