{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE RebindableSyntax #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE FlexibleContexts #-}
{- |
>>> :set -XTypeFamilies
>>> :set -XMultiParamTypeClasses
>>> :set -XFlexibleInstances
>>> :set -XFlexibleContexts
>>> :set -XRebindableSyntax
>>> :set -XTypeApplications
>>> import qualified Prelude
>>> import Prelude hiding ((>>), (>>=), return)
>>> import Control.Dsl
>>> import Control.Dsl.State
>>> import Control.Dsl.Yield
>>> import Control.Dsl.Return
>>> import Data.Void
>>> :{
f = do
Yield "foo"
config <- Get @Bool
when config $ do
Yield "bar"
return ()
return "baz"
:}
>>> :type f
f :: (Dsl (Yield [Char]) r (), Dsl (Return [Char]) r Void,
Dsl Get r Bool) =>
r
>>> f True :: [String]
["foo","bar","baz"]
>>> :{
instance Dsl (Yield String) (IO ()) () where
cpsApply (Yield a) = (Prelude.>>=) (putStrLn $ "Yield " ++ a)
:}
>>> :{
instance Dsl Get (IO ()) Bool where
cpsApply Get f = (putStrLn "Get") Prelude.>> f False
:}
>>> :{
instance Dsl (Return String) (IO ()) Void where
cpsApply (Return a) _ = putStrLn $ "Return " ++ a
:}
>>> f :: IO ()
Yield foo
Get
Return baz
-}
module Control.Dsl(
module Control.Dsl.Dsl,
module Control.Dsl.Return,
module Control.Dsl.Do,
module Control.Dsl.Cont
) where
import Control.Dsl.Return (return)
import Control.Dsl.Dsl (Dsl(..))
import Control.Dsl.Cont (when)
import Control.Dsl.Do ((>>=), (>>))
-- Import modules that contains orphan instances
import Control.Dsl.Shift ()
-- import Control.Dsl.State ()