(;module: lux (lux (control monad) [io #- run] [cli #+ program: CLI Monad]) (luxc ["&" base] ["&;" parser] ["&;" compiler] (module (descriptor ["&;" type])) )) (type: Compilation {#program &;Path #target &;Path}) (def: (marker tokens) (-> (List Text) (CLI Unit)) (cli;after (cli;option tokens) (:: Monad wrap []))) (def: (tagged tags) (-> (List Text) (CLI Text)) (cli;after (cli;option tags) cli;any)) (def: compilation^ (CLI Compilation) ($_ cli;seq (tagged (list "-p" "--program")) (tagged (list "-t" "--target")))) (program: ([command (cli;opt compilation^)] [sources (cli;some (tagged (list "-s" "--source")))]) (case command #;None (io (log! "No REPL for you!")) (#;Some [program target]) (exec (&compiler;compile-program program target sources) (io []))))