Source code is there, can be loaded by Frege Repl 3.24.100 module examples.MyCont where
import frege.control.monad.State import Data.Char import Control.Concurrent as C class MonadIO m where --- Lift a computation from the 'IO' monad. liftIO :: IO a -> m a class MonadTrans t where --- Lift a computation from the argument monad to the constructed monad. lift :: Monad m => m a -> t m a instance MonadIO IO where liftIO io = io instance MonadTrans (ContT r) where lift m = ContT (m >>=) instance (Monad m, MonadIO m) => MonadIO (ContT r m) where liftIO = lift . liftIO data ContT r m a = ContT { runContT :: (a -> m r) -> m r } instance Functor (ContT r m) where fmap f m = ContT $ \c -> ContT.runContT m (c . f) instance Applicative (ContT r m) where pure x = ContT ($ x) f <*> v = ContT $ \c -> ContT.runContT f $ \g -> ContT.runContT v (c . g) m *> k = m >>= \_ -> k instance Monad (ContT r m) where pure x = ContT ($ x) m >>= k = ContT $ \c -> ContT.runContT m (\x -> ContT.runContT (k x) c) callCC :: ((a -> ContT r m b) -> ContT r m a) -> ContT r m a callCC f = ContT $ \c -> ContT.runContT (f (\a -> ContT $ \_ -> c a)) c data Date = native java.util.Date where native new :: () -> IO (MutableIO Date) native toString :: Mutable s Date -> ST s String current :: IO String current = do d <- Date.new () d.toString runContT = ContT.runContT spawn = callCC $ \k -> do lift $ putStrLn "begin capture current continuation ..." (r, s) <- callCC $ \next -> do callCC $ \k2 -> do let f x = k2 (f, x) k (f, "jump to 1") lift $ putStrLn ("can we be here1? -- " ++ s) (r, s) <- callCC $ \next -> do callCC $ \k2 -> do let f x = k2 (f, x) k (f, "jump to 2") lift $ putStrLn ("can we be here2? -- " ++ s) (r, s) <- callCC $ \next -> do callCC $ \k2 -> do let f x = k2 (f, x) k (f, "jump to 3") lift $ putStrLn ("can we be here3? -- " ++ s) return (r, s) fun1 = (`runContT` return) $ do lift $ putStrLn "alpha" (k, s) <- spawn lift $ putStrLn ("in fun1 -- " ++ s) lift $ Thread.sleep (2000L) k "I try to pass some string here" lift $ putStrLn "no chance to be there" -- You received this message because you are subscribed to the Google Groups "Frege Programming Language" group. To unsubscribe from this group and stop receiving emails from it, send an email to frege-programming-language+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.