diff options
| author | Bruce Hill <bruce@bruce-hill.com> | 2018-11-08 15:23:22 -0800 |
|---|---|---|
| committer | Bruce Hill <bruce@bruce-hill.com> | 2018-11-08 15:24:15 -0800 |
| commit | 652c29bdef1f0991cc13bef59d6dc78b657ae9a4 (patch) | |
| tree | 8e335399e77b1893657b9fa985db0738034daac3 /importer.moon | |
| parent | 1f3660f393c1a17988a15b89f18686b28e51a9e7 (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.moon | 33 |
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} |
