diff options
Diffstat (limited to 'acf2/model/set.lua')
-rw-r--r-- | acf2/model/set.lua | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/acf2/model/set.lua b/acf2/model/set.lua new file mode 100644 index 0000000..215056e --- /dev/null +++ b/acf2/model/set.lua @@ -0,0 +1,47 @@ +--[[ +Copyright (c) 2012-2013 Kaarle Ritvanen +See LICENSE file for license details +--]] + +local M = {} + +local TreeNode = require('acf2.model.field').TreeNode +local npairs = require('acf2.model.node').pairs +local object = require('acf2.object') + + +M.Set = object.class(require('acf2.model.node').List) + +function M.Set:init(context, params) + assert(not object.isinstance(params.field, TreeNode)) + object.super(self, M.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.dereference = false + mt.meta.type = 'set' + + function mt.get(k, create) + local i = find(k) + if i then return mt.load(i) end + if create then return k end + 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 + + +return M |