diff options
Diffstat (limited to 'stdlib/source/lux/compiler/meta/cache/dependency.lux')
-rw-r--r-- | stdlib/source/lux/compiler/meta/cache/dependency.lux | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/stdlib/source/lux/compiler/meta/cache/dependency.lux b/stdlib/source/lux/compiler/meta/cache/dependency.lux new file mode 100644 index 000000000..e63fa192b --- /dev/null +++ b/stdlib/source/lux/compiler/meta/cache/dependency.lux @@ -0,0 +1,53 @@ +(.module: + [lux (#- Module) + [data + ["." text] + [collection + [list ("list/." Functor<List> Fold<List>)] + ["dict" dictionary (#+ Dictionary)]]]] + [///io (#+ Module)] + [///archive (#+ Archive)]) + +(type: #export Graph (Dictionary Module (List Module))) + +(def: #export empty Graph (dict.new text.Hash<Text>)) + +(def: #export (add to from) + (-> Module Module Graph Graph) + (|>> (dict.update~ from (list) (|>> (#.Cons to))) + (dict.update~ to (list) id))) + +(def: dependents + (-> Module Graph (Maybe (List Text))) + dict.get) + +(def: #export (remove module dependency) + (-> Module Graph Graph) + (case (dependents module dependency) + (#.Some dependents) + (list/fold remove (dict.remove module dependency) dependents) + + #.None + dependency)) + +(type: #export Dependency + {#module Module + #imports (List Module)}) + +(def: #export (dependency [module imports]) + (-> Dependency Graph) + (list/fold (..add module) ..empty imports)) + +(def: #export graph + (-> (List Dependency) Graph) + (|>> (list/map ..dependency) + (list/fold dict.merge empty))) + +(def: #export (prune archive graph) + (-> Archive Graph Graph) + (list/fold (function (_ module graph) + (if (dict.contains? module archive) + graph + (..remove module graph))) + graph + (dict.keys graph))) |