aboutsummaryrefslogtreecommitdiff
path: root/importer.moon
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2018-11-08 15:23:22 -0800
committerBruce Hill <bruce@bruce-hill.com>2018-11-08 15:24:15 -0800
commit652c29bdef1f0991cc13bef59d6dc78b657ae9a4 (patch)
tree8e335399e77b1893657b9fa985db0738034daac3 /importer.moon
parent1f3660f393c1a17988a15b89f18686b28e51a9e7 (diff)
Major overhaul, splitting nomsu_compiler into nomsu_environment,
nomsu_compiler, and nomsu_decompiler. Also added comprehensions.
Diffstat (limited to 'importer.moon')
-rw-r--r--importer.moon33
1 files changed, 33 insertions, 0 deletions
diff --git a/importer.moon b/importer.moon
new file mode 100644
index 0000000..48a3800
--- /dev/null
+++ b/importer.moon
@@ -0,0 +1,33 @@
+-- This file defines Importer, which is a type of table that can import from other tables
+
+import_to_1_from = (host, to_import)->
+ if host_mt = getmetatable(host)
+ if host_mt.__import
+ host_mt.__import(host, to_import)
+ return
+ for k,v in pairs(to_import)
+ host[k] = v
+_imports = setmetatable({}, {__mode:"k"})
+Importer = setmetatable({
+ __index: (key)=> _imports[@][key]
+ __import: (to_import)=>
+ imports = assert _imports[@]
+ for k,v in pairs(to_import)
+ imports[k] = v
+ continue if v == to_import
+ conflict = @[k]
+ import_to_1_from(conflict, v) if type(conflict) == 'table'
+}, {
+ __call: (t)=>
+ _imports[t] = {}
+ setmetatable(t, @)
+ return t
+})
+
+_1_forked = =>
+ f = Importer{}
+ _imports[f] = assert _imports[@]
+ import_to_1_from(f, @)
+ return f
+
+return {:Importer, :import_to_1_from, :_1_forked}