-- Tests copied from polysemy-plugin:
--
-- https://github.com/polysemy-research/polysemy/tree/master/polysemy-plugin/test
--
-- (c) 2019 Sandy Maguire, licensed under BSD-3-Clause
{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS_GHC -Wno-unused-foralls -fplugin=Effectful.Plugin #-}
module Main where
import Data.String
import Unsafe.Coerce
import Effectful
import Effectful.Dispatch.Dynamic
import Effectful.Error.Static
import Effectful.State.Static.Local
main :: IO ()
main = pure ()
----------------------------------------
-- Tests
class MPTC a b where
mptc :: a -> b
instance MPTC Bool Int where
mptc _ = 1000
uniquelyInt :: [State Int, State String] :>> es => Eff es ()
uniquelyInt = put 10
uniquelyA :: (Num a, [State a, State b] :>> es) => Eff es ()
uniquelyA = put 10
uniquelyString :: [State Int, State String] :>> es => Eff es ()
uniquelyString = put mempty
uniquelyB :: (MPTC Bool b, [State String, State b] :>> es) => Eff es ()
uniquelyB = put $ mptc False
uniquelyState' :: [Error (), State ()] :>> es => Eff es ()
uniquelyState' = pure ()
idState :: State s :> es => Eff es ()
idState = do
s <- get
put s
intState :: State Int :> es => Eff es ()
intState = put 10
numState :: Num a => State a :> es => Eff es ()
numState = put 10
strState :: State String :> es => Eff es ()
strState = put "Hello"
oStrState :: IsString a => State a :> es => Eff es ()
oStrState = put "hello"
err :: Error e :> es => Eff es Bool
err =
catchError
(throwError (error ""))
(\_ _ -> pure True)
errState :: Num s => [Error e, State s] :>> es => Eff es Bool
errState = do
numState
err
newtype MyString = MyString String
deriving (IsString, Eq, Show)
data Janky = forall s. Janky (forall _i. Eff '[State s] ())
jankyState :: Janky
jankyState = Janky $ put True -- The plugin disambiguates effects for concrete rows too
unsafeUnjank :: Janky -> Eff '[State Bool] ()
unsafeUnjank (Janky m) = unsafeCoerce m
data MoreJanky = forall y. MoreJanky (MPTC Bool y => Eff [State (Bool, y), State (Char, y)] ())
mptcGet :: MPTC x Bool => x
mptcGet = undefined
moreJankyState :: MoreJanky
moreJankyState = MoreJanky $ put (mptcGet, True)
data TaggedState k s :: Effect where
TaggedGet :: forall k s m. TaggedState k s m s
TaggedPut :: forall k s m. s -> TaggedState k s m ()
type instance DispatchOf (TaggedState k s) = Dynamic
runTaggedState :: s -> Eff (TaggedState k s : es) a -> Eff es (a, s)
runTaggedState s = reinterpret (runState s) $ \_ -> \case
TaggedGet -> get
TaggedPut s' -> put s'
test :: [TaggedState Char Int, TaggedState Bool Int] :>> es => Eff es ()
test = do
send $ TaggedPut @Bool 10
send $ TaggedPut @Char (-10)
newtype Select a = Select a
data DBAction whichDb :: Effect where
DoSelect :: Select a -> DBAction whichDb m (Maybe a)
type instance DispatchOf (DBAction whichDb) = Dynamic
runDBAction :: Eff (DBAction which : es) a -> Eff es a
runDBAction = interpret $ \_ -> \case
DoSelect (Select a) -> pure $ Just a