Idris2/libs/base/Control/Applicative/Const.idr

113 lines
2.7 KiB
Idris
Raw Normal View History

2021-04-24 09:40:04 +03:00
module Control.Applicative.Const
2021-04-24 12:40:34 +03:00
import Data.Contravariant
2021-04-24 09:40:04 +03:00
import Data.Bits
public export
record Const (a : Type) (b : Type) where
constructor MkConst
2021-04-25 11:30:52 +03:00
runConst : a
2021-04-24 09:40:04 +03:00
public export
Eq a => Eq (Const a b) where
2021-04-25 11:30:52 +03:00
(==) = (==) `on` runConst
2021-04-24 09:40:04 +03:00
public export
Ord a => Ord (Const a b) where
2021-04-25 11:30:52 +03:00
compare = compare `on` runConst
2021-04-24 09:40:04 +03:00
export
Show a => Show (Const a b) where
showPrec p (MkConst v) = showCon p "MkConst" (showArg v)
public export
Semigroup a => Semigroup (Const a b) where
MkConst x <+> MkConst y = MkConst (x <+> y)
public export
Monoid a => Monoid (Const a b) where
neutral = MkConst neutral
public export
Num a => Num (Const a b) where
MkConst x + MkConst y = MkConst (x + y)
MkConst x * MkConst y = MkConst (x * y)
fromInteger = MkConst . fromInteger
public export
Neg a => Neg (Const a b) where
negate (MkConst x) = MkConst (negate x)
MkConst x - MkConst y = MkConst (x - y)
public export
Abs a => Abs (Const a b) where
abs (MkConst x) = MkConst (abs x)
public export
Fractional a => Fractional (Const a b) where
recip (MkConst x) = MkConst (recip x)
MkConst x / MkConst y = MkConst (x / y)
public export
Integral a => Integral (Const a b) where
MkConst x `div` MkConst y = MkConst (x `div` y)
MkConst x `mod` MkConst y = MkConst (x `mod` y)
public export
Bits a => Bits (Const a b) where
Index = Index {a}
MkConst x .&. MkConst y = MkConst (x .&. y)
MkConst x .|. MkConst y = MkConst (x .|. y)
MkConst x `xor` MkConst y = MkConst (x `xor` y)
shiftL (MkConst v) ix = MkConst (shiftL v ix)
shiftR (MkConst v) ix = MkConst (shiftR v ix)
bit = MkConst . bit
zeroBits = MkConst zeroBits
complement (MkConst v) = MkConst (complement v)
oneBits = MkConst oneBits
complementBit (MkConst v) ix = MkConst (complementBit v ix)
clearBit (MkConst v) ix = MkConst (clearBit v ix)
testBit (MkConst v) ix = testBit v ix
setBit (MkConst v) ix = MkConst (setBit v ix)
public export
FromString a => FromString (Const a b) where
fromString = MkConst . fromString
public export
Functor (Const a) where
map _ (MkConst v) = MkConst v
2021-04-24 12:40:34 +03:00
public export
Contravariant (Const a) where
contramap _ (MkConst v) = MkConst v
2021-04-24 09:40:04 +03:00
public export
Monoid a => Applicative (Const a) where
pure _ = MkConst neutral
MkConst x <*> MkConst y = MkConst (x <+> y)
public export
Foldable (Const a) where
foldr _ acc _ = acc
foldl _ acc _ = acc
null _ = True
public export
Traversable (Const a) where
traverse _ (MkConst v) = pure (MkConst v)
public export
Bifunctor Const where
bimap f _ (MkConst v) = MkConst (f v)
public export
Bifoldable Const where
bifoldr f _ acc (MkConst v) = f v acc
bifoldl f _ acc (MkConst v) = f acc v
binull _ = False
public export
Bitraversable Const where
bitraverse f _ (MkConst v) = MkConst <$> f v