aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/lux/compiler/default/phase.lux
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--stdlib/source/lux/compiler/default/phase.lux16
1 files changed, 16 insertions, 0 deletions
diff --git a/stdlib/source/lux/compiler/default/phase.lux b/stdlib/source/lux/compiler/default/phase.lux
index ae146be74..85567e45c 100644
--- a/stdlib/source/lux/compiler/default/phase.lux
+++ b/stdlib/source/lux/compiler/default/phase.lux
@@ -33,6 +33,22 @@
operation
(:: error.Monad<Error> map product.right)))
+(def: #export state
+ (All [s o]
+ (Operation s s))
+ (function (_ state)
+ (#error.Success [state state])))
+
+(def: #export (sub [get set] operation)
+ (All [s s' o]
+ (-> [(-> s s') (-> s' s s)]
+ (Operation s' o)
+ (Operation s o)))
+ (function (_ state)
+ (do error.Monad<Error>
+ [[state' output] (operation (get state))]
+ (wrap [(set state' state) output]))))
+
(def: #export fail
(-> Text Operation)
(|>> error.fail (state.lift error.Monad<Error>)))