cpsGetChar processFunc = do c <- liftIO getChar if c == 'q' then return () else callCC $ \ k -> cpsProcessChar c >>= k cpsProcessChar c = do liftIO $ putChar c if c == 'x' then return () else callCC $ \ k -> cpsGetChar >>= k