summaryrefslogtreecommitdiffstats
path: root/acf/model/set.lua
diff options
context:
space:
mode:
Diffstat (limited to 'acf/model/set.lua')
-rw-r--r--acf/model/set.lua49
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