aboutsummaryrefslogtreecommitdiff
path: root/data/stack.scm
diff options
context:
space:
mode:
Diffstat (limited to 'data/stack.scm')
-rw-r--r--data/stack.scm21
1 files changed, 21 insertions, 0 deletions
diff --git a/data/stack.scm b/data/stack.scm
new file mode 100644
index 0000000..c28d648
--- /dev/null
+++ b/data/stack.scm
@@ -0,0 +1,21 @@
+(define-module (data stack)
+ #:use-module (control monad)
+ #:use-module (control monad state))
+
+;;; Simple stateful stack module for showing the state monad
+;;; in action. These functions assume that they are in a
+;;; (state list) monad. But dynamic types!
+
+(define (pop)
+ (do st <- (get)
+ let top = (car st)
+ (put (cdr st))
+ (return-state top)))
+
+(define (peek)
+ (do st <- (get)
+ (return-state (car st))))
+
+(define (push v)
+ (do st <- (get)
+ (put (cons v st))))