From 7d9c43916b0600ac4879dfe9793eab807a83ab2b Mon Sep 17 00:00:00 2001 From: Kaarle Ritvanen Date: Mon, 10 Mar 2014 22:45:18 +0200 Subject: rename ACF2 to Alpine Configurator (aconf) --- aconf/model/set.lua | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 aconf/model/set.lua (limited to 'aconf/model/set.lua') 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 -- cgit v1.2.3