aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/lux/data/collection/stack.lux
diff options
context:
space:
mode:
Diffstat (limited to 'stdlib/source/lux/data/collection/stack.lux')
-rw-r--r--stdlib/source/lux/data/collection/stack.lux42
1 files changed, 42 insertions, 0 deletions
diff --git a/stdlib/source/lux/data/collection/stack.lux b/stdlib/source/lux/data/collection/stack.lux
new file mode 100644
index 000000000..c0e1af182
--- /dev/null
+++ b/stdlib/source/lux/data/collection/stack.lux
@@ -0,0 +1,42 @@
+(.module:
+ lux
+ (lux (data (collection [list]))))
+
+## [Types]
+(type: #export (Stack a)
+ (List a))
+
+## [Values]
+(def: #export empty
+ Stack
+ (list))
+
+(def: #export (size stack)
+ (All [a] (-> (Stack a) Nat))
+ (list.size stack))
+
+(def: #export (empty? stack)
+ (All [a] (-> (Stack a) Bool))
+ (list.empty? stack))
+
+(def: #export (peek stack)
+ (All [a] (-> (Stack a) (Maybe a)))
+ (case stack
+ #.Nil
+ #.None
+
+ (#.Cons value _)
+ (#.Some value)))
+
+(def: #export (pop stack)
+ (All [a] (-> (Stack a) (Stack a)))
+ (case stack
+ #.Nil
+ #.Nil
+
+ (#.Cons _ stack')
+ stack'))
+
+(def: #export (push value stack)
+ (All [a] (-> a (Stack a) (Stack a)))
+ (#.Cons value stack))