diff options
author | Kaarle Ritvanen <kaarle.ritvanen@datakunkku.fi> | 2013-03-20 16:53:56 +0200 |
---|---|---|
committer | Kaarle Ritvanen <kaarle.ritvanen@datakunkku.fi> | 2013-03-25 23:13:11 +0200 |
commit | 395da378214f4537901860b76c15ab1e405d1d3f (patch) | |
tree | 5ae8f5d888f58376db1757242b9f83fba616c876 /acf/model/set.lua | |
parent | 5d663a122ea39802c096a57ad3fb471dee347759 (diff) | |
download | aconf-395da378214f4537901860b76c15ab1e405d1d3f.tar.bz2 aconf-395da378214f4537901860b76c15ab1e405d1d3f.tar.xz |
new data type: set
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 |