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