@@ -1,4 +1,6 @@
1{-# LANGUAGE UndecidableInstances #-}
2{-# LANGUAGE UndecidableInstances #-}
3+{-# OPTIONS_GHC -Wno-noncanonical-monad-instances #-}
2{-# OPTIONS_HADDOCK not-home #-}
4{-# OPTIONS_HADDOCK not-home #-}
3-- | The 'Eff' monad.
5-- | The 'Eff' monad.
@@ -28,6 +30,7 @@ module Effectful.Internal.Monad
28 , stateEffectM
30 , stateEffectM
33+import Control.Applicative (liftA2)
31import Control.Concurrent (myThreadId)
34import Control.Concurrent (myThreadId)
32import Control.Monad.Base
35import Control.Monad.Base
33import Control.Monad.Catch
36import Control.Monad.Catch
@@ -70,15 +73,24 @@ unsafeUnliftEff f = unsafeEff $ \es -> do
71instance Functor (Eff es) where
74instance Functor (Eff es) where
72 fmap f (Eff m) = unsafeEff $ \es -> f <$> m es
75 fmap f (Eff m) = unsafeEff $ \es -> f <$> m es
76+ a <$ Eff fb = unsafeEff $ \es -> a <$ fb es
74instance Applicative (Eff es) where
78instance Applicative (Eff es) where
75 pure = unsafeEff_ . pure
79 pure = unsafeEff_ . pure
76 Eff mf <*> Eff mx = unsafeEff $ \es -> mf es <*> mx es
80 Eff mf <*> Eff mx = unsafeEff $ \es -> mf es <*> mx es
81+ Eff ma *> Eff mb = unsafeEff $ \es -> ma es *> mb es
82+ Eff ma <* Eff mb = unsafeEff $ \es -> ma es <* mb es
83+ liftA2 f (Eff ma) (Eff mb) = unsafeEff $ \es -> liftA2 f (ma es) (mb es)
78instance Monad (Eff es) where
85instance Monad (Eff es) where
86+ return = unsafeEff_ . pure
79− Eff m >>= k = unsafeEff $ \es -> do
87+ Eff m >>= k = unsafeEff $ \es -> m es >>= \a -> unEff (k a) es
80− a <- m es
88+ -- https://gitlab.haskell.org/ghc/ghc/-/issues/20008
81− unEff (k a) es
89+ Eff ma >> Eff mb = unsafeEff $ \es -> ma es >> mb es
91+#if __GLASGOW_HASKELL__ < 808
92+ fail = unsafeEff_ . fail
83----------------------------------------
95----------------------------------------
84-- Exception
96-- Exception