aboutsummaryrefslogtreecommitdiff
path: root/importer.moon
diff options
context:
space:
mode:
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}