aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/lux/data/trace.lux
diff options
context:
space:
mode:
Diffstat (limited to 'stdlib/source/lux/data/trace.lux')
-rw-r--r--stdlib/source/lux/data/trace.lux33
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))