module State ( returnST -- :: a -> ST a s , bindST -- :: ST a s -> (a -> ST b s) -> ST b s , ST(..) ) where import Prelude hiding (snd, fst) data ST a s = S (s -> (a, s)) {-@ data ST a s
Bool, post :: a -> s -> Bool> = S (ys::(x:s-> ((a, s)))) @-} {-@ returnST :: forall Bool, post :: a -> s -> Bool>. xState:a -> ST <{v:s| true}, post> a s @-} returnST :: a -> ST a s returnST x = S $ \s -> (x, s) {-@ bindST :: forall Bool, qbind :: a -> s -> Bool, rbind :: b -> s -> Bool>. ST a s -> (xbind:a -> ST <{v:s | true}, rbind> b s) -> ST b s @-} bindST :: ST a s -> (a -> ST b s) -> ST b s bindST (S m) k = S $ \s -> let (a, s') = m s in apply (k a) s' {-@ apply :: forall Bool, q :: a -> s -> Bool>. ST
a s -> s
-> (a, s)
@-} apply :: ST a s -> s -> (a, s) apply (S f) s = f s