aboutsummaryrefslogtreecommitdiffstats
path: root/lib/mmmfs/fileder.moon
diff options
context:
space:
mode:
authors-ol <s-ol@users.noreply.github.com>2018-11-01 10:17:55 +0000
committers-ol <s-ol@users.noreply.github.com>2018-11-01 10:17:55 +0000
commit30fb0dc40d595b9e0b7747ad8e5c4e8cf7e3023b (patch)
treedc56f20ec4d78115e15761c402589b5aec94ef55 /lib/mmmfs/fileder.moon
parentdefer all scripts (diff)
downloadmmm-30fb0dc40d595b9e0b7747ad8e5c4e8cf7e3023b.tar.gz
mmm-30fb0dc40d595b9e0b7747ad8e5c4e8cf7e3023b.zip
move mmm code from lib to mmm etc
Diffstat (limited to 'lib/mmmfs/fileder.moon')
-rw-r--r--lib/mmmfs/fileder.moon155
1 files changed, 0 insertions, 155 deletions
diff --git a/lib/mmmfs/fileder.moon b/lib/mmmfs/fileder.moon
deleted file mode 100644
index c3e40f7..0000000
--- a/lib/mmmfs/fileder.moon
+++ /dev/null
@@ -1,155 +0,0 @@
-require = relative ..., 1
-import get_conversions from require '.conversion'
-
--- Key of a Fileder Property
--- contains:
--- * @name - key name or '' for main content
--- * @type - type string (type -> type -> type)
-class Key
- -- instantiate from table w/ keys described above
- -- or string like '@name: @type' (name optional)
- new: (opts, second) =>
- if 'string' == type second
- @name, @type = (opts or ''), second
- elseif 'string' == type opts
- @name, @type = opts\match '(%w+): *(.+)'
- if not @name
- @name = ''
- @type = opts
- elseif 'table' == type opts
- @name = opts.name
- @type = opts.type
- else
- error "wrong argument type: #{type opts}, #{type second}"
-
- -- format as a string (see constructor)
- tostring: =>
- if @name == ''
- @type
- else
- "#{@name}: #{@type}"
-
--- Fileder itself
--- contains:
--- * @props - Property Map (Key to Value)
--- * @children - Children Array
-class Fileder
- -- instantiate from props and children tables
- -- or mix in one table (numeric keys are children, remainder props)
- -- prop-keys are passed to Key constructor
- new: (props, children) =>
- if not children
- children = for i, child in ipairs props
- props[i] = nil
- child
-
- -- automatically mount children on insert
- @children = setmetatable {}, __newindex: (t, k, child) ->
- rawset t, k, child
- if @path == '/'
- child\mount '/'
- elseif @path
- child\mount @path .. '/'
-
- -- copy children
- for i, child in ipairs children
- @children[i] = child
-
- -- automatically reify string keys on insert
- @props = setmetatable {}, __newindex: (t, key, v) ->
- rawset t, key, nil -- fix for fengari.io
- rawset t, (Key key), v
-
- -- copy props
- for k, v in pairs props
- @props[k] = v
-
- -- recursively walk to and return the fileder with @path == path
- -- * path - the path to walk to
- walk: (path) =>
- -- early-out if we are outside of the path already
- return unless path\match '^' .. @path
-
- -- gotcha
- return @ if path == @path
-
- for child in *@children
- result = child\walk path
- return result if result
-
- -- recursively mount fileder and children at path
- -- * path - the path to mount at (default: '/')
- -- * mount_as - dont append own name to path
- mount: (path='/', mount_as=false) =>
- assert not @path, "mounted twice: #{@path} and now #{path}"
-
- if mount_as
- @path = path
- else
- @path = path .. @gett 'name: alpha'
-
- if @path == '/'
- for child in *@children
- child\mount '/'
- else
- for child in *@children
- child\mount @path .. '/'
-
- -- recursively iterate all children (coroutine)
- -- * depth - depth to stop after; 1 = yield only self (default: infinite)
- iterate: (depth=0) =>
- coroutine.yield @
- return if depth == 1
-
- for child in *@children
- child\iterate depth - 1
-
- -- find property key according to criteria, nil if no value or conversion path
- -- * ... - arguments like Key
- find: (...) =>
- want = Key ...
-
- -- filter props by name
- matching = [ key for key in pairs @props when key.name == want.name ]
- return unless #matching > 0
-
- -- get shortest conversion path
- shortest_path, start = get_conversions want.type, [ key.type for key in *matching ]
-
- if start
- for key in *matching
- if key.type == start
- return key, shortest_path
-
- error "couldn't find key after resolution?"
-
- -- get property according to criteria, nil if no value or conversion path
- -- * ... - arguments like Key
- get: (...) =>
- want = Key ...
-
- -- find matching key and shortest conversion path
- key, conversions = @find want
-
- if key
- value = @props[key]
-
- -- apply conversions (in reverse order)
- for i=#conversions,1,-1
- { :inp, :out, :transform } = conversions[i]
- value = transform value, @
-
- value, key
-
- -- like @get, throw if no value or conversion path
- gett: (...) =>
- want = Key ...
-
- value, key = @get want
- assert value, "node doesn't have value for '#{want\tostring!}'"
- value, key
-
-{
- :Key
- :Fileder
-}