packages feed

control-monad-queue-0.0.9: tests/CpSt.hs

module CpSt (CpSt(..), get, put, enQ, deQ, runResult, runCpSt)  where

import Data.Queue.TwoStack

newtype CpSt r s a
      = CpSt { unCpSt :: (a -> s -> r) -> s -> r }

instance Monad (CpSt r s) where
   return a  = CpSt (\k -> k a)
   m >>= f   = CpSt (\k -> unCpSt m (\a -> unCpSt (f a) k))

get     = CpSt (\k s -> k s   s   )
put s'  = CpSt (\k _ -> k ()  s'  )

--runCpSt :: CpSt a s a -> s -> (a,s)
runCpSt m s0 = unCpSt m (\a s -> (a,s)) s0

enQ e = CpSt (\k q -> k () (enque e q))

deQ   = CpSt (\k q -> case deque q of
                        (e,q') -> k e q')

runResult m = unCpSt m (\a s -> a) empty