module Gamgine.Coroutine where

newtype Coroutine i o = Coroutine {
   forall i o. Coroutine i o -> i -> (o, Coroutine i o)
runCoroutine :: i -> (o, Coroutine i o)
   }

newtype CoroutineM m i o = CoroutineM {
   forall (m :: * -> *) i o.
CoroutineM m i o -> i -> m (o, CoroutineM m i o)
runCoroutineM :: i -> m (o, CoroutineM m i o)
   }