diff options
Diffstat (limited to 'stdlib/source/lux/data/trace.lux')
-rw-r--r-- | stdlib/source/lux/data/trace.lux | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/stdlib/source/lux/data/trace.lux b/stdlib/source/lux/data/trace.lux new file mode 100644 index 000000000..f8094565b --- /dev/null +++ b/stdlib/source/lux/data/trace.lux @@ -0,0 +1,33 @@ +(;module: + lux + (lux (control ["m" monoid] + functor + comonad) + [macro])) + +(type: #export (Trace t a) + {#monoid (m;Monoid t) + #trace (-> t a)}) + +(struct: #export Functor<Trace> (All [t] (Functor (Trace t))) + (def: (map f fa) + (update@ #trace (. f) fa))) + +(struct: #export CoMonad<Trace> (All [t] (CoMonad (Trace t))) + (def: functor Functor<Trace>) + + (def: (unwrap wa) + ((get@ #trace wa) + (get@ [#monoid #m;unit] wa))) + + (def: (split wa) + (let [monoid (get@ #monoid wa)] + {#monoid monoid + #trace (lambda [t1] + {#monoid monoid + #trace (lambda [t2] ((get@ #trace wa) + (:: monoid append t1 t2)))})}))) + +(def: #export (run context tracer) + (All [t a] (-> t (Trace t a) a)) + (:: tracer trace context)) |