(;module: lux (lux (control monad) (data [text "T/" Eq] text/format ["R" result])) (luxc ["&" base])) (def: (new-module hash) (-> Nat Module) {#;module-hash hash #;module-aliases (list) #;defs (list) #;imports (list) #;tags (list) #;types (list) #;module-anns (list) #;module-state #;Active}) (def: #export (define (^@ full-name [module-name def-name]) definition) (-> Ident Def (Lux Unit)) (function [compiler] (case (&;pl-get module-name (get@ #;modules compiler)) (#;Some module) (case (&;pl-get def-name (get@ #;defs module)) #;None (#R;Success [(update@ #;modules (&;pl-put module-name (update@ #;defs (: (-> (List [Text Def]) (List [Text Def])) (|>. (#;Cons [def-name definition]))) module)) compiler) []]) (#;Some already-existing) (#R;Error (format "Cannot re-define definiton: " (%ident full-name)))) #;None (#R;Error (format "Cannot define in unknown module: " module-name))))) (def: #export (create hash name) (-> Nat Text (Lux Module)) (function [compiler] (let [module (new-module hash)] (#R;Success [(update@ #;modules (&;pl-put name module) compiler) module])))) (do-template [ ] [(def: #export ( module-name) (-> Text (Lux Unit)) (function [compiler] (case (|> compiler (get@ #;modules) (&;pl-get module-name)) (#;Some module) (let [active? (case (get@ #;module-state module) #;Active true _ false)] (if active? (#R;Success [(update@ #;modules (&;pl-put module-name (set@ #;module-state module)) compiler) []]) (#R;Error "Can only change the state of a currently-active module."))) #;None (#R;Error (format "Module does not exist: " module-name))))) (def: #export ( module-name) (-> Text (Lux Bool)) (function [compiler] (case (|> compiler (get@ #;modules) (&;pl-get module-name)) (#;Some module) (#R;Success [compiler (case (get@ #;module-state module) true _ false)]) #;None (#R;Error (format "Module does not exist: " module-name))) ))] [flag-active! active? #;Active] [flag-compiled! compiled? #;Compiled] [flag-cached! cached? #;Cached] )