diff options
author | Eduardo Julian | 2020-05-16 20:19:34 -0400 |
---|---|---|
committer | Eduardo Julian | 2020-05-16 20:19:34 -0400 |
commit | 9965c551e7ccd6de8c47c7b1b78f804801810dac (patch) | |
tree | 05538c6ede048898f375ce3a333a2c4dd6b6f4a7 /new-luxc/source/luxc/lang/translation/jvm/imports.jvm.lux | |
parent | 65d0beab4cb53a9ba8574e1133d105420f0b23aa (diff) |
Parallel compilation for the new compiler(s).
Diffstat (limited to '')
-rw-r--r-- | new-luxc/source/luxc/lang/translation/jvm/imports.jvm.lux | 154 |
1 files changed, 0 insertions, 154 deletions
diff --git a/new-luxc/source/luxc/lang/translation/jvm/imports.jvm.lux b/new-luxc/source/luxc/lang/translation/jvm/imports.jvm.lux deleted file mode 100644 index ec791019c..000000000 --- a/new-luxc/source/luxc/lang/translation/jvm/imports.jvm.lux +++ /dev/null @@ -1,154 +0,0 @@ -(.module: - lux - (lux (control [monad #+ do] - ["p" parser] - ["ex" exception #+ exception:] - pipe) - (concurrency [promise #+ Promise] - [stm #+ Var STM]) - (data ["e" error #+ Error] - [maybe] - [product] - [text "text/" Eq<Text>] - text/format - (coll [list "list/" Functor<List> Fold<List>] - (dictionary ["dict" unordered #+ Dict]))) - [macro] - (macro [code] - ["s" syntax]) - [io #+ IO Process io] - [host]) - (luxc ["&" lang] - (lang [".L" module]))) - -(do-template [<name>] - [(exception: #export (<name> {message Text}) - message)] - - [Invalid-Imports] - [Module-Cannot-Import-Itself] - [Circular-Dependency] - ) - -(host.import: (java/util/concurrent/Future a) - (get [] #io a)) - -(host.import: (java/util/concurrent/CompletableFuture a) - (new []) - (complete [a] boolean) - (#static [a] completedFuture [a] (CompletableFuture a))) - -(type: Import - {#module Text - #alias Text}) - -(def: import (s.Syntax Import) (s.tuple (p.seq s.text s.text))) - -(def: compilations - (Var (Dict Text (CompletableFuture (Error Lux)))) - (stm.var (dict.new text.Hash<Text>))) - -(def: (promise-to-future promise) - (All [a] (-> (Promise a) (Future a))) - (let [future (CompletableFuture::new [])] - (exec (:: promise.Functor<Promise> map - (function (_ value) (CompletableFuture::complete [value] future)) - promise) - future))) - -(def: from-io - (All [a] (-> (IO a) (Process a))) - (:: io.Monad<IO> map (|>> #e.Success))) - -(def: (translate-dependency translate-module dependency compiler) - (-> (-> Text Lux (Process Lux)) - (-> Text Lux (IO (Future (Error Lux))))) - (<| (Future::get []) - promise-to-future - (do promise.Monad<Promise> - [[new? future] (stm.commit (: (STM [Bit (CompletableFuture (Error Lux))]) - (do stm.Monad<STM> - [current-compilations (stm.read compilations)] - (case (dict.get dependency current-compilations) - (#.Some ongoing) - (wrap [#0 ongoing]) - - #.None - (do @ - [#let [pending (: (CompletableFuture (Error Lux)) - (CompletableFuture::new []))] - _ (stm.write (dict.put dependency pending current-compilations) - compilations)] - (wrap [#1 pending]))))))] - (if new? - (exec (promise.future (io (CompletableFuture::complete [(io.run (translate-module dependency compiler))] - future))) - (wrap future)) - (wrap future))))) - -(def: compiled? - (-> Module Bit) - (|>> (get@ #.module-state) - (case> - (^or #.Cached #.Compiled) - #1 - - _ - #0))) - -(def: (merge-modules current-module from-dependency from-current) - (-> Text (List [Text Module]) (List [Text Module]) (List [Text Module])) - (|> from-dependency - (list.filter (|>> product.right compiled?)) - (list/fold (function (_ [dep-name dep-module] total) (&.pl-put dep-name dep-module total)) - from-current))) - -(def: (merge-compilers current-module dependency total) - (-> Text Lux Lux Lux) - (|> total - (update@ #.modules (merge-modules current-module (get@ #.modules dependency))) - (set@ #.seed (get@ #.seed dependency)))) - -(def: #export (translate-imports translate-module annotations) - (-> (-> Text Lux (Process Lux)) - Code - (Meta (Process Lux))) - (do macro.Monad<Meta> - [_ (moduleL.set-annotations annotations) - current-module macro.current-module-name - imports (let [imports (|> (macro.get-tuple-ann (name-of #.imports) annotations) - (maybe.default (list)))] - (case (s.run imports (p.some import)) - (#e.Success imports) - (wrap imports) - - (#e.Error error) - (&.throw Invalid-Imports (%code (code.tuple imports))))) - dependencies (monad.map @ (: (-> [Text Text] (Meta (IO (Future (Error Lux))))) - (function (_ [dependency alias]) - (do @ - [_ (&.assert Module-Cannot-Import-Itself current-module - (not (text/= current-module dependency))) - already-seen? (moduleL.exists? dependency) - circular-dependency? (if already-seen? - (moduleL.active? dependency) - (wrap #0)) - _ (&.assert Circular-Dependency (format "From: " current-module "\n" - " To: " dependency) - (not circular-dependency?)) - _ (moduleL.import dependency) - _ (if (text/= "" alias) - (wrap []) - (moduleL.alias alias dependency)) - compiler macro.get-compiler] - (if already-seen? - (wrap (io (CompletableFuture::completedFuture [(#e.Success compiler)]))) - (wrap (translate-dependency translate-module dependency compiler)))))) - imports) - compiler macro.get-compiler] - (wrap (do io.Monad<Process> - [dependencies (monad.seq io.Monad<Process> (list/map from-io dependencies)) - dependencies (|> dependencies - (list/map (Future::get [])) - (monad.seq io.Monad<Process>))] - (wrap (list/fold (merge-compilers current-module) compiler dependencies)))))) |