cleff-0.2.1.0: src/Cleff/Internal/Instances.hs
{-# OPTIONS_GHC -Wno-orphans #-}
-- |
-- Copyright: (c) 2021 Xy Ren
-- License: BSD3
-- Maintainer: xy.r@outlook.com
-- Stability: unstable
-- Portability: non-portable (GHC only)
--
-- This module contains lifted instances of some typeclasses for 'Eff' for convenience. They are all exported in the
-- "Cleff" module so you shouldn't need to import this module.
--
-- __This is an /internal/ module and its API may change even between minor versions.__ Therefore you should be
-- extra careful if you're to depend on this module.
module Cleff.Internal.Instances () where
import Cleff.Internal.Monad (Eff)
import Control.Applicative (Applicative (liftA2))
import Control.Monad.Zip (MonadZip (munzip, mzipWith))
import Data.String (IsString (fromString))
-- | @since 0.2.1.0
instance Bounded a => Bounded (Eff es a) where
minBound = pure minBound
maxBound = pure maxBound
-- | @since 0.2.1.0
instance Num a => Num (Eff es a) where
(+) = liftA2 (+)
(-) = liftA2 (-)
(*) = liftA2 (*)
negate = fmap negate
abs = fmap abs
signum = fmap signum
fromInteger = pure . fromInteger
-- | @since 0.2.1.0
instance Fractional a => Fractional (Eff es a) where
(/) = liftA2 (/)
recip = fmap recip
fromRational = pure . fromRational
-- | @since 0.2.1.0
instance Floating a => Floating (Eff es a) where
pi = pure pi
exp = fmap exp
log = fmap log
sqrt = fmap sqrt
(**) = liftA2 (**)
logBase = liftA2 logBase
sin = fmap sin
cos = fmap cos
tan = fmap tan
asin = fmap asin
acos = fmap acos
atan = fmap atan
sinh = fmap sinh
cosh = fmap cosh
tanh = fmap tanh
asinh = fmap asinh
acosh = fmap acosh
atanh = fmap atanh
-- | @since 0.2.1.0
instance Semigroup a => Semigroup (Eff es a) where
(<>) = liftA2 (<>)
-- | @since 0.2.1.0
instance Monoid a => Monoid (Eff es a) where
mempty = pure mempty
-- | @since 0.2.1.0
instance IsString a => IsString (Eff es a) where
fromString = pure . fromString
-- | Compatibility instance for @MonadComprehensions@.
--
-- @since 0.2.1.0
instance MonadZip (Eff es) where
mzipWith = liftA2
munzip x = (fst <$> x, snd <$> x)