Idris2/libs/base/Control/Monad/Identity.idr
Jeremy 394613432f
Add documentation for Control.Monad.* (#2365)
Co-authored-by: Zoe Stafford <36511192+Z-snails@users.noreply.github.com>
2022-03-25 10:14:25 +00:00

98 lines
2.2 KiB
Idris

module Control.Monad.Identity
import Data.Bits
%default total
||| The identity monad. This monad provides no abilities other than pure
||| computation.
public export
record Identity (a : Type) where
constructor Id
runIdentity : a
public export
Functor Identity where
map fn (Id a) = Id (fn a)
public export
Applicative Identity where
pure x = Id x
(Id f) <*> (Id g) = Id (f g)
public export
Monad Identity where
(Id x) >>= k = k x
public export
Show a => Show (Identity a) where
showPrec d (Id x) = showCon d "Id" $ showArg x
public export
Eq a => Eq (Identity a) where
(Id x) == (Id y) = x == y
public export
Ord a => Ord (Identity a) where
compare (Id x) (Id y) = compare x y
-- public export
-- Enum a => Enum (Identity a) where
-- toNat (Id x) = toNat x
-- fromNat n = Id $ fromNat n
-- pred (Id n) = Id $ pred n
public export
Semigroup a => Semigroup (Identity a) where
(<+>) x y = Id (runIdentity x <+> runIdentity y)
public export
Monoid a => Monoid (Identity a) where
neutral = Id (neutral)
public export
Num a => Num (Identity a) where
Id x + Id y = Id (x + y)
Id x * Id y = Id (x * y)
fromInteger = Id . fromInteger
public export
Neg a => Neg (Identity a) where
negate (Id x) = Id (negate x)
Id x - Id y = Id (x - y)
public export
Abs a => Abs (Identity a) where
abs (Id x) = Id (abs x)
public export
Fractional a => Fractional (Identity a) where
recip (Id x) = Id (recip x)
Id x / Id y = Id (x / y)
public export
Integral a => Integral (Identity a) where
Id x `div` Id y = Id (x `div` y)
Id x `mod` Id y = Id (x `mod` y)
public export
Bits a => Bits (Identity a) where
Index = Index {a}
Id x .&. Id y = Id (x .&. y)
Id x .|. Id y = Id (x .|. y)
Id x `xor` Id y = Id (x `xor` y)
shiftL (Id v) ix = Id (shiftL v ix)
shiftR (Id v) ix = Id (shiftR v ix)
bit = Id . bit
zeroBits = Id zeroBits
complement (Id v) = Id (complement v)
oneBits = Id oneBits
complementBit (Id v) ix = Id (complementBit v ix)
clearBit (Id v) ix = Id (clearBit v ix)
testBit (Id v) ix = testBit v ix
setBit (Id v) ix = Id (setBit v ix)
public export
FromString a => FromString (Identity a) where
fromString = Id . fromString