Skip to content

Instantly share code, notes, and snippets.

@janewang
Forked from igstan/state-monad.coffee
Created July 8, 2012 04:15
Show Gist options
  • Save janewang/3069266 to your computer and use it in GitHub Desktop.
Save janewang/3069266 to your computer and use it in GitHub Desktop.
State Monad in CoffeeScript
push = (element) -> (stack) ->
newStack = [element].concat stack
{value: element, stack: newStack}
pop = (stack) ->
element = stack[0]
newStack = stack.slice 1
{value: element, stack: newStack}
bind = (stackOperation, continuation) -> (stack) ->
result = stackOperation stack
(continuation result.value) result.stack
result = (value) -> (stack) ->
{value: value, stack: stack}
initialStack = []
computation1 = bind \
(push 4), -> bind \
(push 5), -> bind \
pop, (a) -> bind \
pop, (b) ->
result a + ":" + b
computation2 = bind \
(push 2), -> bind \
(push 3), -> bind \
pop, (a) -> bind \
pop, (b) ->
result a + ":" + b
composed = bind \
computation1, (a) -> bind \
computation2, (b) ->
result a + ":" + b
finalResult = composed initialStack
console.log finalResult.value
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment