{-# LANGUAGE CPP #-}
{-# LANGUAGE UnboxedTuples #-}
{-# OPTIONS_GHC -Wno-orphans #-}
module Avail.Instances () where
import Avail.Derive
import Avail.Internal
import Control.Applicative (Alternative)
import Control.Monad (MonadPlus)
import Control.Monad.Fail (MonadFail)
import Control.Monad.IO.Class (MonadIO)
import Prelude hiding (MonadFail)
#ifdef AVAIL_exceptions
import Control.Monad.Catch (MonadCatch, MonadMask, MonadThrow)
#endif
#ifdef AVAIL_mtl
import Control.Monad.Cont (MonadCont)
import Control.Monad.Except (MonadError)
import Control.Monad.RWS (MonadRWS)
import Control.Monad.Reader (MonadReader)
import Control.Monad.State (MonadState)
import Control.Monad.Writer (MonadWriter)
#endif
#ifdef AVAIL_semigroupoids
import Data.Functor.Alt (Alt ((<!>)))
import Data.Functor.Plus (Plus)
#endif
#ifdef AVAIL_unliftio
import Control.Monad.IO.Unlift (MonadUnliftIO)
#endif
#ifdef AVAIL_monad_control
import Control.Monad.Base (MonadBase)
import Control.Monad.Trans.Control (MonadBaseControl)
#endif
#ifdef AVAIL_primitive
import Control.Monad.Primitive (PrimMonad)
#endif
#ifdef AVAIL_capability
import Capability.Error (HasCatch, HasThrow)
import Capability.Reader (HasReader)
import Capability.Sink (HasSink)
import Capability.Source (HasSource)
import Capability.State (HasState)
import Capability.Writer (HasWriter)
#endif
avail [t| MonadIO |]
avail [t| MonadFail |]
avail [t| Alternative |]
avail' [[t| Alternative |]] [t| MonadPlus |]
#ifdef AVAIL_exceptions
avail [t| MonadThrow |]
avail' [[t| MonadThrow |]] [t| MonadCatch |]
avail' [[t| MonadCatch |]] [t| MonadMask |]
#endif
#ifdef AVAIL_mtl
avail [t| MonadCont |]
with1' "r" $ \r -> avail [t| MonadReader $r |]
with1' "w" $ \w -> avail [t| MonadWriter $w |]
with1' "s" $ \s -> avail [t| MonadState $s |]
with1' "e" $ \e -> avail [t| MonadError $e |]
with3' "r" "w" "s" $ \r w s -> avail'
[ [t| MonadReader $r |]
, [t| MonadWriter $w |]
, [t| MonadState $s |]
] [t| MonadRWS $r $w $s |]
#endif
#ifdef AVAIL_semigroupoids
avail [t| Plus |]
instance IsEff Alt where
type Superclasses Alt = '[]
instance Alt m => Alt (M m) where
UnsafeLift m <!> UnsafeLift n = UnsafeLift $ m <!> n
#endif
#ifdef AVAIL_unliftio
avail' [[t| MonadIO |]] [t| MonadUnliftIO |]
#endif
#ifdef AVAIL_monad_control
with1' "b" $ \b -> avail [t| MonadBase $b |]
with1' "b" $ \b -> avail' [[t| MonadBase $b |]] [t| MonadBaseControl $b |]
#endif
#ifdef AVAIL_primitive
avail [t| PrimMonad |]
#endif
#ifdef AVAIL_capability
with2' "tag" "a" $ \tag a -> avail [t| HasSource $tag $a |]
with2' "tag" "a" $ \tag a -> avail [t| HasSink $tag $a |]
with2' "tag" "e" $ \tag e -> avail [t| HasThrow $tag $e |]
with2' "tag" "r" $ \tag r -> avail' [[t| HasSource $tag $r |]] [t| HasReader $tag $r |]
with2' "tag" "w" $ \tag w -> avail' [[t| HasSink $tag $w |]] [t| HasWriter $tag $w |]
with2' "tag" "e" $ \tag e -> avail' [[t| HasThrow $tag $e |]] [t| HasCatch $tag $e |]
with2' "tag" "s" $ \tag s -> avail'
[ [t| HasSource $tag $s |]
, [t| HasSink $tag $s |]
] [t| HasState $tag $s |]
#endif