do-notation-dsl-0.1.0.0: src/Control/Dsl/Shift.hs
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{- |
Description : Delimited continuations
-}
module Control.Dsl.Shift where
import Data.Void
import Control.Dsl.Cont
import Control.Dsl.Dsl
import Prelude hiding ((>>), (>>=), return)
{- |
>>> :set -XTypeOperators
>>> :set -XRebindableSyntax
>>> import Prelude hiding ((>>), (>>=), return)
>>> import Control.Dsl
>>> import Control.Dsl.Return
>>> import Control.Dsl.Yield
>>> import Control.Dsl.Empty
>>> :{
earlyGenerator :: Bool -> [String] !! Integer
earlyGenerator earlyReturn = do
Yield "inside earlyGenerator"
when earlyReturn $ do
Yield "early return"
return 1
Yield "normal return"
return 0
:}
>>> :{
earlyGeneratorTest :: [String]
earlyGeneratorTest = do
Yield "before earlyGenerator"
i <- Shift $ earlyGenerator True
Yield "after earlyGenerator"
Yield $ "the return value of earlyGenerator is " ++ show i
empty
:}
>>> earlyGeneratorTest
["before earlyGenerator","inside earlyGenerator","early return","after earlyGenerator","the return value of earlyGenerator is 1"]
-}
newtype Shift r0 r a = Shift (r0 !! a)
instance Dsl (Shift r) r a where
cpsApply (Shift k) f = k f
-- instance Dsl m a d => Dsl m a (Shift d b) where
-- cpsApply k f = Shift $ \g -> cpsApply k $ \a -> cpsApply (f a) g