diff options
author | Kaarle Ritvanen <kaarle.ritvanen@datakunkku.fi> | 2014-03-10 22:45:18 +0200 |
---|---|---|
committer | Kaarle Ritvanen <kaarle.ritvanen@datakunkku.fi> | 2014-03-24 01:18:13 +0200 |
commit | 7d9c43916b0600ac4879dfe9793eab807a83ab2b (patch) | |
tree | ec54ed64c9a557b6ea4ad88d31138a02d3e0cd04 /aconf/model/set.lua | |
parent | cb6c243dc356ef1d46d7ddb96e6ea6ae007c6cca (diff) | |
download | aconf-7d9c43916b0600ac4879dfe9793eab807a83ab2b.tar.bz2 aconf-7d9c43916b0600ac4879dfe9793eab807a83ab2b.tar.xz |
rename ACF2 to Alpine Configurator (aconf)
Diffstat (limited to 'aconf/model/set.lua')
-rw-r--r-- | aconf/model/set.lua | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/aconf/model/set.lua b/aconf/model/set.lua new file mode 100644 index 0000000..efed851 --- /dev/null +++ b/aconf/model/set.lua @@ -0,0 +1,56 @@ +--[[ +Copyright (c) 2012-2014 Kaarle Ritvanen +See LICENSE file for license details +--]] + +local M = {} + +local TreeNode = require('aconf.model.field').TreeNode +local node = require('aconf.model.node') +local object = require('aconf.object') +local pth = require('aconf.path') +local setdefaults = require('aconf.util').setdefaults + + +M.Set = object.class(require('aconf.model.node').List) + +function M.Set:init(context, params) + assert(not object.isinstance(params.field, TreeNode)) + params.field.dereference = false + + object.super(self, M.Set):init(context, params, 'set') + + local function find(value) + value = node.BoundMember( + self, pth.wildcard, params.field + ):normalize(value) + + for i, member in node.pairs(self) do + if member == value then return i, value end + end + end + + local mt = getmetatable(self) + + function mt.get(k, options) + options = setdefaults(options or {}, {dereference=true}) + local i, v = find(k) + if i then return mt.load(i, options) end + if options.create then return v 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 + + function mt.contains(v) return find(v) and true or false end + + local insert = mt.insert + function mt.insert(v) if not mt.contains(v) then insert(v) end end +end + + +return M |