Skip to content

Instantly share code, notes, and snippets.

@philipschwarz
Created April 11, 2020 15:10
Show Gist options
  • Save philipschwarz/e5d073dd1fbd4f523cfe3583fa157e68 to your computer and use it in GitHub Desktop.
Save philipschwarz/e5d073dd1fbd4f523cfe3583fa157e68 to your computer and use it in GitHub Desktop.
use .base
use List Optional
List.head : [a] -> Optional a
List.head a = List.at 0 a
ability State s where
put : s -> {State s} ()
get : {State s} s
pop : '{State [a]} (Optional a)
pop = ' let stack = get
put (drop 1 stack)
head stack
push : a -> {State [a]} ()
push a = put (cons a get)
> .base.head [1,2,3]
state : s -> '({State s} a) -> a
state s c =
h s e = match e with
{ State.get -> k } ->
handle h s in k s
{ State.put s -> k } ->
handle h s in k ()
{ a } -> a
handle h s in !c
stackProgram : '{State [Nat]} ()
stackProgram =
'( a = pop
if a != 5
then push 5
else
push 3
push 8 )
runStack : [Nat]
runStack = state [5,4,3,2,1] stackProgram
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment