diff options
Diffstat (limited to 'acf/model/set.lua')
-rw-r--r-- | acf/model/set.lua | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/acf/model/set.lua b/acf/model/set.lua new file mode 100644 index 0000000..be6c2de --- /dev/null +++ b/acf/model/set.lua @@ -0,0 +1,49 @@ +--[[ +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') + + +local function find(set, value) + for i, member in npairs(set) do + if member == value then return i end + end +end + + +Set = object.class(require('acf.model.node').Collection) + +function Set:init(context, params) + assert(not object.isinstance(params.field, TreeNode)) + object.super(self, Set):init(context, params) + + local mt = getmetatable(self) + mt.meta.type = 'set' + + function mt.__index(t, k) return find(self, k) and k end + + function mt.__newindex(t, k, v) + assert(v == nil) + local i = find(self, k) + if not i then return end + + local len = #mt.members() + while i < len do + mt.set(i, mt.get(i + 1)) + i = i + 1 + end + mt.set(len, nil) + end +end + + +function add(set, value) + local mt = getmetatable(set) + if not find(set, value) then mt.set(#mt.members() + 1, value) end +end |