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