module Unison.Util.Defn
( Defn (..),
)
where
import Data.Bifoldable (Bifoldable (..))
import Data.Bifunctor (Bifunctor (..))
import Data.Bitraversable (Bitraversable (..))
import GHC.Generics (Generic)
data Defn term typ
= TermDefn term
| TypeDefn typ
deriving stock ((forall x. Defn term typ -> Rep (Defn term typ) x)
-> (forall x. Rep (Defn term typ) x -> Defn term typ)
-> Generic (Defn term typ)
forall x. Rep (Defn term typ) x -> Defn term typ
forall x. Defn term typ -> Rep (Defn term typ) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall term typ x. Rep (Defn term typ) x -> Defn term typ
forall term typ x. Defn term typ -> Rep (Defn term typ) x
$cfrom :: forall term typ x. Defn term typ -> Rep (Defn term typ) x
from :: forall x. Defn term typ -> Rep (Defn term typ) x
$cto :: forall term typ x. Rep (Defn term typ) x -> Defn term typ
to :: forall x. Rep (Defn term typ) x -> Defn term typ
Generic, (forall a b. (a -> b) -> Defn term a -> Defn term b)
-> (forall a b. a -> Defn term b -> Defn term a)
-> Functor (Defn term)
forall a b. a -> Defn term b -> Defn term a
forall a b. (a -> b) -> Defn term a -> Defn term b
forall term a b. a -> Defn term b -> Defn term a
forall term a b. (a -> b) -> Defn term a -> Defn term b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall term a b. (a -> b) -> Defn term a -> Defn term b
fmap :: forall a b. (a -> b) -> Defn term a -> Defn term b
$c<$ :: forall term a b. a -> Defn term b -> Defn term a
<$ :: forall a b. a -> Defn term b -> Defn term a
Functor, (forall m. Monoid m => Defn term m -> m)
-> (forall m a. Monoid m => (a -> m) -> Defn term a -> m)
-> (forall m a. Monoid m => (a -> m) -> Defn term a -> m)
-> (forall a b. (a -> b -> b) -> b -> Defn term a -> b)
-> (forall a b. (a -> b -> b) -> b -> Defn term a -> b)
-> (forall b a. (b -> a -> b) -> b -> Defn term a -> b)
-> (forall b a. (b -> a -> b) -> b -> Defn term a -> b)
-> (forall a. (a -> a -> a) -> Defn term a -> a)
-> (forall a. (a -> a -> a) -> Defn term a -> a)
-> (forall a. Defn term a -> [a])
-> (forall a. Defn term a -> Bool)
-> (forall a. Defn term a -> Int)
-> (forall a. Eq a => a -> Defn term a -> Bool)
-> (forall a. Ord a => Defn term a -> a)
-> (forall a. Ord a => Defn term a -> a)
-> (forall a. Num a => Defn term a -> a)
-> (forall a. Num a => Defn term a -> a)
-> Foldable (Defn term)
forall a. Eq a => a -> Defn term a -> Bool
forall a. Num a => Defn term a -> a
forall a. Ord a => Defn term a -> a
forall m. Monoid m => Defn term m -> m
forall a. Defn term a -> Bool
forall a. Defn term a -> Int
forall a. Defn term a -> [a]
forall a. (a -> a -> a) -> Defn term a -> a
forall term a. Eq a => a -> Defn term a -> Bool
forall term a. Num a => Defn term a -> a
forall term a. Ord a => Defn term a -> a
forall m a. Monoid m => (a -> m) -> Defn term a -> m
forall term m. Monoid m => Defn term m -> m
forall term a. Defn term a -> Bool
forall term a. Defn term a -> Int
forall term a. Defn term a -> [a]
forall b a. (b -> a -> b) -> b -> Defn term a -> b
forall a b. (a -> b -> b) -> b -> Defn term a -> b
forall term a. (a -> a -> a) -> Defn term a -> a
forall term m a. Monoid m => (a -> m) -> Defn term a -> m
forall term b a. (b -> a -> b) -> b -> Defn term a -> b
forall term a b. (a -> b -> b) -> b -> Defn term a -> b
forall (t :: * -> *).
(forall m. Monoid m => t m -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. t a -> [a])
-> (forall a. t a -> Bool)
-> (forall a. t a -> Int)
-> (forall a. Eq a => a -> t a -> Bool)
-> (forall a. Ord a => t a -> a)
-> (forall a. Ord a => t a -> a)
-> (forall a. Num a => t a -> a)
-> (forall a. Num a => t a -> a)
-> Foldable t
$cfold :: forall term m. Monoid m => Defn term m -> m
fold :: forall m. Monoid m => Defn term m -> m
$cfoldMap :: forall term m a. Monoid m => (a -> m) -> Defn term a -> m
foldMap :: forall m a. Monoid m => (a -> m) -> Defn term a -> m
$cfoldMap' :: forall term m a. Monoid m => (a -> m) -> Defn term a -> m
foldMap' :: forall m a. Monoid m => (a -> m) -> Defn term a -> m
$cfoldr :: forall term a b. (a -> b -> b) -> b -> Defn term a -> b
foldr :: forall a b. (a -> b -> b) -> b -> Defn term a -> b
$cfoldr' :: forall term a b. (a -> b -> b) -> b -> Defn term a -> b
foldr' :: forall a b. (a -> b -> b) -> b -> Defn term a -> b
$cfoldl :: forall term b a. (b -> a -> b) -> b -> Defn term a -> b
foldl :: forall b a. (b -> a -> b) -> b -> Defn term a -> b
$cfoldl' :: forall term b a. (b -> a -> b) -> b -> Defn term a -> b
foldl' :: forall b a. (b -> a -> b) -> b -> Defn term a -> b
$cfoldr1 :: forall term a. (a -> a -> a) -> Defn term a -> a
foldr1 :: forall a. (a -> a -> a) -> Defn term a -> a
$cfoldl1 :: forall term a. (a -> a -> a) -> Defn term a -> a
foldl1 :: forall a. (a -> a -> a) -> Defn term a -> a
$ctoList :: forall term a. Defn term a -> [a]
toList :: forall a. Defn term a -> [a]
$cnull :: forall term a. Defn term a -> Bool
null :: forall a. Defn term a -> Bool
$clength :: forall term a. Defn term a -> Int
length :: forall a. Defn term a -> Int
$celem :: forall term a. Eq a => a -> Defn term a -> Bool
elem :: forall a. Eq a => a -> Defn term a -> Bool
$cmaximum :: forall term a. Ord a => Defn term a -> a
maximum :: forall a. Ord a => Defn term a -> a
$cminimum :: forall term a. Ord a => Defn term a -> a
minimum :: forall a. Ord a => Defn term a -> a
$csum :: forall term a. Num a => Defn term a -> a
sum :: forall a. Num a => Defn term a -> a
$cproduct :: forall term a. Num a => Defn term a -> a
product :: forall a. Num a => Defn term a -> a
Foldable, Functor (Defn term)
Foldable (Defn term)
(Functor (Defn term), Foldable (Defn term)) =>
(forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Defn term a -> f (Defn term b))
-> (forall (f :: * -> *) a.
Applicative f =>
Defn term (f a) -> f (Defn term a))
-> (forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Defn term a -> m (Defn term b))
-> (forall (m :: * -> *) a.
Monad m =>
Defn term (m a) -> m (Defn term a))
-> Traversable (Defn term)
forall term. Functor (Defn term)
forall term. Foldable (Defn term)
forall term (m :: * -> *) a.
Monad m =>
Defn term (m a) -> m (Defn term a)
forall term (f :: * -> *) a.
Applicative f =>
Defn term (f a) -> f (Defn term a)
forall term (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Defn term a -> m (Defn term b)
forall term (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Defn term a -> f (Defn term b)
forall (t :: * -> *).
(Functor t, Foldable t) =>
(forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> t a -> f (t b))
-> (forall (f :: * -> *) a. Applicative f => t (f a) -> f (t a))
-> (forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> t a -> m (t b))
-> (forall (m :: * -> *) a. Monad m => t (m a) -> m (t a))
-> Traversable t
forall (m :: * -> *) a.
Monad m =>
Defn term (m a) -> m (Defn term a)
forall (f :: * -> *) a.
Applicative f =>
Defn term (f a) -> f (Defn term a)
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Defn term a -> m (Defn term b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Defn term a -> f (Defn term b)
$ctraverse :: forall term (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Defn term a -> f (Defn term b)
traverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Defn term a -> f (Defn term b)
$csequenceA :: forall term (f :: * -> *) a.
Applicative f =>
Defn term (f a) -> f (Defn term a)
sequenceA :: forall (f :: * -> *) a.
Applicative f =>
Defn term (f a) -> f (Defn term a)
$cmapM :: forall term (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Defn term a -> m (Defn term b)
mapM :: forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Defn term a -> m (Defn term b)
$csequence :: forall term (m :: * -> *) a.
Monad m =>
Defn term (m a) -> m (Defn term a)
sequence :: forall (m :: * -> *) a.
Monad m =>
Defn term (m a) -> m (Defn term a)
Traversable, Int -> Defn term typ -> ShowS
[Defn term typ] -> ShowS
Defn term typ -> String
(Int -> Defn term typ -> ShowS)
-> (Defn term typ -> String)
-> ([Defn term typ] -> ShowS)
-> Show (Defn term typ)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall term typ.
(Show term, Show typ) =>
Int -> Defn term typ -> ShowS
forall term typ. (Show term, Show typ) => [Defn term typ] -> ShowS
forall term typ. (Show term, Show typ) => Defn term typ -> String
$cshowsPrec :: forall term typ.
(Show term, Show typ) =>
Int -> Defn term typ -> ShowS
showsPrec :: Int -> Defn term typ -> ShowS
$cshow :: forall term typ. (Show term, Show typ) => Defn term typ -> String
show :: Defn term typ -> String
$cshowList :: forall term typ. (Show term, Show typ) => [Defn term typ] -> ShowS
showList :: [Defn term typ] -> ShowS
Show, Defn term typ -> Defn term typ -> Bool
(Defn term typ -> Defn term typ -> Bool)
-> (Defn term typ -> Defn term typ -> Bool) -> Eq (Defn term typ)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall term typ.
(Eq term, Eq typ) =>
Defn term typ -> Defn term typ -> Bool
$c== :: forall term typ.
(Eq term, Eq typ) =>
Defn term typ -> Defn term typ -> Bool
== :: Defn term typ -> Defn term typ -> Bool
$c/= :: forall term typ.
(Eq term, Eq typ) =>
Defn term typ -> Defn term typ -> Bool
/= :: Defn term typ -> Defn term typ -> Bool
Eq, Eq (Defn term typ)
Eq (Defn term typ) =>
(Defn term typ -> Defn term typ -> Ordering)
-> (Defn term typ -> Defn term typ -> Bool)
-> (Defn term typ -> Defn term typ -> Bool)
-> (Defn term typ -> Defn term typ -> Bool)
-> (Defn term typ -> Defn term typ -> Bool)
-> (Defn term typ -> Defn term typ -> Defn term typ)
-> (Defn term typ -> Defn term typ -> Defn term typ)
-> Ord (Defn term typ)
Defn term typ -> Defn term typ -> Bool
Defn term typ -> Defn term typ -> Ordering
Defn term typ -> Defn term typ -> Defn term typ
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall term typ. (Ord term, Ord typ) => Eq (Defn term typ)
forall term typ.
(Ord term, Ord typ) =>
Defn term typ -> Defn term typ -> Bool
forall term typ.
(Ord term, Ord typ) =>
Defn term typ -> Defn term typ -> Ordering
forall term typ.
(Ord term, Ord typ) =>
Defn term typ -> Defn term typ -> Defn term typ
$ccompare :: forall term typ.
(Ord term, Ord typ) =>
Defn term typ -> Defn term typ -> Ordering
compare :: Defn term typ -> Defn term typ -> Ordering
$c< :: forall term typ.
(Ord term, Ord typ) =>
Defn term typ -> Defn term typ -> Bool
< :: Defn term typ -> Defn term typ -> Bool
$c<= :: forall term typ.
(Ord term, Ord typ) =>
Defn term typ -> Defn term typ -> Bool
<= :: Defn term typ -> Defn term typ -> Bool
$c> :: forall term typ.
(Ord term, Ord typ) =>
Defn term typ -> Defn term typ -> Bool
> :: Defn term typ -> Defn term typ -> Bool
$c>= :: forall term typ.
(Ord term, Ord typ) =>
Defn term typ -> Defn term typ -> Bool
>= :: Defn term typ -> Defn term typ -> Bool
$cmax :: forall term typ.
(Ord term, Ord typ) =>
Defn term typ -> Defn term typ -> Defn term typ
max :: Defn term typ -> Defn term typ -> Defn term typ
$cmin :: forall term typ.
(Ord term, Ord typ) =>
Defn term typ -> Defn term typ -> Defn term typ
min :: Defn term typ -> Defn term typ -> Defn term typ
Ord)
instance Bifunctor Defn where
bimap :: forall a b c d. (a -> b) -> (c -> d) -> Defn a c -> Defn b d
bimap a -> b
f c -> d
g = \case
TermDefn a
x -> b -> Defn b d
forall term typ. term -> Defn term typ
TermDefn (a -> b
f a
x)
TypeDefn c
y -> d -> Defn b d
forall term typ. typ -> Defn term typ
TypeDefn (c -> d
g c
y)
instance Bifoldable Defn where
bifoldMap :: forall m a b. Monoid m => (a -> m) -> (b -> m) -> Defn a b -> m
bifoldMap a -> m
f b -> m
g = \case
TermDefn a
x -> a -> m
f a
x
TypeDefn b
y -> b -> m
g b
y
instance Bitraversable Defn where
bitraverse :: forall (f :: * -> *) a c b d.
Applicative f =>
(a -> f c) -> (b -> f d) -> Defn a b -> f (Defn c d)
bitraverse a -> f c
f b -> f d
g = \case
TermDefn a
x -> c -> Defn c d
forall term typ. term -> Defn term typ
TermDefn (c -> Defn c d) -> f c -> f (Defn c d)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> f c
f a
x
TypeDefn b
y -> d -> Defn c d
forall term typ. typ -> Defn term typ
TypeDefn (d -> Defn c d) -> f d -> f (Defn c d)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> b -> f d
g b
y