diff options
author | Eduardo Julian | 2019-04-06 21:14:27 -0400 |
---|---|---|
committer | Eduardo Julian | 2019-04-06 21:14:27 -0400 |
commit | a75f032ff219fdd639580455a6d3e83fd05d5592 (patch) | |
tree | f02c8e6b9c7c8fd932790b0fc8152fa30be55d7f /stdlib/source/lux/abstract/monad/indexed.lux | |
parent | 9a22a2616ad08d4bda9555510aa4aaeced4b69f3 (diff) |
Created the "lux/abstract" branch and moved some modules into it.
Diffstat (limited to 'stdlib/source/lux/abstract/monad/indexed.lux')
-rw-r--r-- | stdlib/source/lux/abstract/monad/indexed.lux | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/stdlib/source/lux/abstract/monad/indexed.lux b/stdlib/source/lux/abstract/monad/indexed.lux new file mode 100644 index 000000000..57a18c109 --- /dev/null +++ b/stdlib/source/lux/abstract/monad/indexed.lux @@ -0,0 +1,64 @@ +(.module: + [lux #* + [control + [monad] + ["p" parser]] + [data + [collection + ["." list ("#;." functor fold)]]] + ["." macro + ["s" syntax (#+ Syntax syntax:)]]]) + +(signature: #export (IxMonad m) + (: (All [p a] + (-> a (m p p a))) + wrap) + + (: (All [ii it io vi vo] + (-> (-> vi (m it io vo)) + (m ii it vi) + (m ii io vo))) + bind)) + +(type: Binding [Code Code]) + +(def: binding + (Syntax Binding) + (p.and s.any s.any)) + +(type: Context + (#Let (List Binding)) + (#Bind Binding)) + +(def: context + (Syntax Context) + (p.or (p.after (s.this (' #let)) + (s.tuple (p.some binding))) + binding)) + +(def: (pair-list [binding value]) + (All [a] (-> [a a] (List a))) + (list binding value)) + +(syntax: #export (do monad + {context (s.tuple (p.some context))} + expression) + (macro.with-gensyms [g!_ g!bind] + (wrap (list (` (let [(~' @) (~ monad) + {#..wrap (~' wrap) + #..bind (~ g!bind)} (~' @)] + (~ (list;fold (function (_ context next) + (case context + (#Let bindings) + (` (let [(~+ (|> bindings + (list;map pair-list) + list.concat))] + (~ next))) + + (#Bind [binding value]) + (` ((~ g!bind) + (.function ((~ g!_) (~ binding)) + (~ next)) + (~ value))))) + expression + (list.reverse context))))))))) |