{-# LANGUAGE DataKinds #-}

module U.Codebase.Referent where

import Control.Lens (Prism, Traversal)
import Data.Bifoldable (Bifoldable (..))
import Data.Bitraversable (Bitraversable (..))
import Data.Generics.Sum (_Ctor)
import U.Codebase.Decl (ConstructorId)
import U.Codebase.Reference (Reference, Reference')
import U.Codebase.Reference qualified as Reference
import Unison.Hash (Hash)
import Unison.Prelude
import Unison.ShortHash (ShortHash)
import Unison.ShortHash qualified as SH

data ConstructorType
  = DataConstructor
  | EffectConstructor
  deriving (Int -> ConstructorType -> ShowS
[ConstructorType] -> ShowS
ConstructorType -> String
(Int -> ConstructorType -> ShowS)
-> (ConstructorType -> String)
-> ([ConstructorType] -> ShowS)
-> Show ConstructorType
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ConstructorType -> ShowS
showsPrec :: Int -> ConstructorType -> ShowS
$cshow :: ConstructorType -> String
show :: ConstructorType -> String
$cshowList :: [ConstructorType] -> ShowS
showList :: [ConstructorType] -> ShowS
Show, ConstructorType -> ConstructorType -> Bool
(ConstructorType -> ConstructorType -> Bool)
-> (ConstructorType -> ConstructorType -> Bool)
-> Eq ConstructorType
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ConstructorType -> ConstructorType -> Bool
== :: ConstructorType -> ConstructorType -> Bool
$c/= :: ConstructorType -> ConstructorType -> Bool
/= :: ConstructorType -> ConstructorType -> Bool
Eq, Eq ConstructorType
Eq ConstructorType =>
(ConstructorType -> ConstructorType -> Ordering)
-> (ConstructorType -> ConstructorType -> Bool)
-> (ConstructorType -> ConstructorType -> Bool)
-> (ConstructorType -> ConstructorType -> Bool)
-> (ConstructorType -> ConstructorType -> Bool)
-> (ConstructorType -> ConstructorType -> ConstructorType)
-> (ConstructorType -> ConstructorType -> ConstructorType)
-> Ord ConstructorType
ConstructorType -> ConstructorType -> Bool
ConstructorType -> ConstructorType -> Ordering
ConstructorType -> ConstructorType -> ConstructorType
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
$ccompare :: ConstructorType -> ConstructorType -> Ordering
compare :: ConstructorType -> ConstructorType -> Ordering
$c< :: ConstructorType -> ConstructorType -> Bool
< :: ConstructorType -> ConstructorType -> Bool
$c<= :: ConstructorType -> ConstructorType -> Bool
<= :: ConstructorType -> ConstructorType -> Bool
$c> :: ConstructorType -> ConstructorType -> Bool
> :: ConstructorType -> ConstructorType -> Bool
$c>= :: ConstructorType -> ConstructorType -> Bool
>= :: ConstructorType -> ConstructorType -> Bool
$cmax :: ConstructorType -> ConstructorType -> ConstructorType
max :: ConstructorType -> ConstructorType -> ConstructorType
$cmin :: ConstructorType -> ConstructorType -> ConstructorType
min :: ConstructorType -> ConstructorType -> ConstructorType
Ord)

type Referent = Referent' Reference Reference

type ReferentH = Referent' (Reference' Text (Maybe Hash)) (Reference' Text Hash)

data Referent' termRef typeRef
  = Ref termRef
  | Con typeRef ConstructorId
  deriving (Referent' termRef typeRef -> Referent' termRef typeRef -> Bool
(Referent' termRef typeRef -> Referent' termRef typeRef -> Bool)
-> (Referent' termRef typeRef -> Referent' termRef typeRef -> Bool)
-> Eq (Referent' termRef typeRef)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall termRef typeRef.
(Eq termRef, Eq typeRef) =>
Referent' termRef typeRef -> Referent' termRef typeRef -> Bool
$c== :: forall termRef typeRef.
(Eq termRef, Eq typeRef) =>
Referent' termRef typeRef -> Referent' termRef typeRef -> Bool
== :: Referent' termRef typeRef -> Referent' termRef typeRef -> Bool
$c/= :: forall termRef typeRef.
(Eq termRef, Eq typeRef) =>
Referent' termRef typeRef -> Referent' termRef typeRef -> Bool
/= :: Referent' termRef typeRef -> Referent' termRef typeRef -> Bool
Eq, Eq (Referent' termRef typeRef)
Eq (Referent' termRef typeRef) =>
(Referent' termRef typeRef
 -> Referent' termRef typeRef -> Ordering)
-> (Referent' termRef typeRef -> Referent' termRef typeRef -> Bool)
-> (Referent' termRef typeRef -> Referent' termRef typeRef -> Bool)
-> (Referent' termRef typeRef -> Referent' termRef typeRef -> Bool)
-> (Referent' termRef typeRef -> Referent' termRef typeRef -> Bool)
-> (Referent' termRef typeRef
    -> Referent' termRef typeRef -> Referent' termRef typeRef)
-> (Referent' termRef typeRef
    -> Referent' termRef typeRef -> Referent' termRef typeRef)
-> Ord (Referent' termRef typeRef)
Referent' termRef typeRef -> Referent' termRef typeRef -> Bool
Referent' termRef typeRef -> Referent' termRef typeRef -> Ordering
Referent' termRef typeRef
-> Referent' termRef typeRef -> Referent' termRef typeRef
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 termRef typeRef.
(Ord termRef, Ord typeRef) =>
Eq (Referent' termRef typeRef)
forall termRef typeRef.
(Ord termRef, Ord typeRef) =>
Referent' termRef typeRef -> Referent' termRef typeRef -> Bool
forall termRef typeRef.
(Ord termRef, Ord typeRef) =>
Referent' termRef typeRef -> Referent' termRef typeRef -> Ordering
forall termRef typeRef.
(Ord termRef, Ord typeRef) =>
Referent' termRef typeRef
-> Referent' termRef typeRef -> Referent' termRef typeRef
$ccompare :: forall termRef typeRef.
(Ord termRef, Ord typeRef) =>
Referent' termRef typeRef -> Referent' termRef typeRef -> Ordering
compare :: Referent' termRef typeRef -> Referent' termRef typeRef -> Ordering
$c< :: forall termRef typeRef.
(Ord termRef, Ord typeRef) =>
Referent' termRef typeRef -> Referent' termRef typeRef -> Bool
< :: Referent' termRef typeRef -> Referent' termRef typeRef -> Bool
$c<= :: forall termRef typeRef.
(Ord termRef, Ord typeRef) =>
Referent' termRef typeRef -> Referent' termRef typeRef -> Bool
<= :: Referent' termRef typeRef -> Referent' termRef typeRef -> Bool
$c> :: forall termRef typeRef.
(Ord termRef, Ord typeRef) =>
Referent' termRef typeRef -> Referent' termRef typeRef -> Bool
> :: Referent' termRef typeRef -> Referent' termRef typeRef -> Bool
$c>= :: forall termRef typeRef.
(Ord termRef, Ord typeRef) =>
Referent' termRef typeRef -> Referent' termRef typeRef -> Bool
>= :: Referent' termRef typeRef -> Referent' termRef typeRef -> Bool
$cmax :: forall termRef typeRef.
(Ord termRef, Ord typeRef) =>
Referent' termRef typeRef
-> Referent' termRef typeRef -> Referent' termRef typeRef
max :: Referent' termRef typeRef
-> Referent' termRef typeRef -> Referent' termRef typeRef
$cmin :: forall termRef typeRef.
(Ord termRef, Ord typeRef) =>
Referent' termRef typeRef
-> Referent' termRef typeRef -> Referent' termRef typeRef
min :: Referent' termRef typeRef
-> Referent' termRef typeRef -> Referent' termRef typeRef
Ord, Int -> Referent' termRef typeRef -> ShowS
[Referent' termRef typeRef] -> ShowS
Referent' termRef typeRef -> String
(Int -> Referent' termRef typeRef -> ShowS)
-> (Referent' termRef typeRef -> String)
-> ([Referent' termRef typeRef] -> ShowS)
-> Show (Referent' termRef typeRef)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall termRef typeRef.
(Show termRef, Show typeRef) =>
Int -> Referent' termRef typeRef -> ShowS
forall termRef typeRef.
(Show termRef, Show typeRef) =>
[Referent' termRef typeRef] -> ShowS
forall termRef typeRef.
(Show termRef, Show typeRef) =>
Referent' termRef typeRef -> String
$cshowsPrec :: forall termRef typeRef.
(Show termRef, Show typeRef) =>
Int -> Referent' termRef typeRef -> ShowS
showsPrec :: Int -> Referent' termRef typeRef -> ShowS
$cshow :: forall termRef typeRef.
(Show termRef, Show typeRef) =>
Referent' termRef typeRef -> String
show :: Referent' termRef typeRef -> String
$cshowList :: forall termRef typeRef.
(Show termRef, Show typeRef) =>
[Referent' termRef typeRef] -> ShowS
showList :: [Referent' termRef typeRef] -> ShowS
Show, (forall x.
 Referent' termRef typeRef -> Rep (Referent' termRef typeRef) x)
-> (forall x.
    Rep (Referent' termRef typeRef) x -> Referent' termRef typeRef)
-> Generic (Referent' termRef typeRef)
forall x.
Rep (Referent' termRef typeRef) x -> Referent' termRef typeRef
forall x.
Referent' termRef typeRef -> Rep (Referent' termRef typeRef) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall termRef typeRef x.
Rep (Referent' termRef typeRef) x -> Referent' termRef typeRef
forall termRef typeRef x.
Referent' termRef typeRef -> Rep (Referent' termRef typeRef) x
$cfrom :: forall termRef typeRef x.
Referent' termRef typeRef -> Rep (Referent' termRef typeRef) x
from :: forall x.
Referent' termRef typeRef -> Rep (Referent' termRef typeRef) x
$cto :: forall termRef typeRef x.
Rep (Referent' termRef typeRef) x -> Referent' termRef typeRef
to :: forall x.
Rep (Referent' termRef typeRef) x -> Referent' termRef typeRef
Generic, (forall a b.
 (a -> b) -> Referent' termRef a -> Referent' termRef b)
-> (forall a b. a -> Referent' termRef b -> Referent' termRef a)
-> Functor (Referent' termRef)
forall a b. a -> Referent' termRef b -> Referent' termRef a
forall a b. (a -> b) -> Referent' termRef a -> Referent' termRef b
forall termRef a b. a -> Referent' termRef b -> Referent' termRef a
forall termRef a b.
(a -> b) -> Referent' termRef a -> Referent' termRef b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall termRef a b.
(a -> b) -> Referent' termRef a -> Referent' termRef b
fmap :: forall a b. (a -> b) -> Referent' termRef a -> Referent' termRef b
$c<$ :: forall termRef a b. a -> Referent' termRef b -> Referent' termRef a
<$ :: forall a b. a -> Referent' termRef b -> Referent' termRef a
Functor, (forall m. Monoid m => Referent' termRef m -> m)
-> (forall m a. Monoid m => (a -> m) -> Referent' termRef a -> m)
-> (forall m a. Monoid m => (a -> m) -> Referent' termRef a -> m)
-> (forall a b. (a -> b -> b) -> b -> Referent' termRef a -> b)
-> (forall a b. (a -> b -> b) -> b -> Referent' termRef a -> b)
-> (forall b a. (b -> a -> b) -> b -> Referent' termRef a -> b)
-> (forall b a. (b -> a -> b) -> b -> Referent' termRef a -> b)
-> (forall a. (a -> a -> a) -> Referent' termRef a -> a)
-> (forall a. (a -> a -> a) -> Referent' termRef a -> a)
-> (forall a. Referent' termRef a -> [a])
-> (forall a. Referent' termRef a -> Bool)
-> (forall a. Referent' termRef a -> Int)
-> (forall a. Eq a => a -> Referent' termRef a -> Bool)
-> (forall a. Ord a => Referent' termRef a -> a)
-> (forall a. Ord a => Referent' termRef a -> a)
-> (forall a. Num a => Referent' termRef a -> a)
-> (forall a. Num a => Referent' termRef a -> a)
-> Foldable (Referent' termRef)
forall a. Eq a => a -> Referent' termRef a -> Bool
forall a. Num a => Referent' termRef a -> a
forall a. Ord a => Referent' termRef a -> a
forall m. Monoid m => Referent' termRef m -> m
forall a. Referent' termRef a -> Bool
forall a. Referent' termRef a -> Int
forall a. Referent' termRef a -> [a]
forall a. (a -> a -> a) -> Referent' termRef a -> a
forall termRef a. Eq a => a -> Referent' termRef a -> Bool
forall termRef a. Num a => Referent' termRef a -> a
forall termRef a. Ord a => Referent' termRef a -> a
forall m a. Monoid m => (a -> m) -> Referent' termRef a -> m
forall termRef m. Monoid m => Referent' termRef m -> m
forall termRef a. Referent' termRef a -> Bool
forall termRef a. Referent' termRef a -> Int
forall termRef a. Referent' termRef a -> [a]
forall b a. (b -> a -> b) -> b -> Referent' termRef a -> b
forall a b. (a -> b -> b) -> b -> Referent' termRef a -> b
forall termRef a. (a -> a -> a) -> Referent' termRef a -> a
forall termRef m a.
Monoid m =>
(a -> m) -> Referent' termRef a -> m
forall termRef b a. (b -> a -> b) -> b -> Referent' termRef a -> b
forall termRef a b. (a -> b -> b) -> b -> Referent' termRef 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 termRef m. Monoid m => Referent' termRef m -> m
fold :: forall m. Monoid m => Referent' termRef m -> m
$cfoldMap :: forall termRef m a.
Monoid m =>
(a -> m) -> Referent' termRef a -> m
foldMap :: forall m a. Monoid m => (a -> m) -> Referent' termRef a -> m
$cfoldMap' :: forall termRef m a.
Monoid m =>
(a -> m) -> Referent' termRef a -> m
foldMap' :: forall m a. Monoid m => (a -> m) -> Referent' termRef a -> m
$cfoldr :: forall termRef a b. (a -> b -> b) -> b -> Referent' termRef a -> b
foldr :: forall a b. (a -> b -> b) -> b -> Referent' termRef a -> b
$cfoldr' :: forall termRef a b. (a -> b -> b) -> b -> Referent' termRef a -> b
foldr' :: forall a b. (a -> b -> b) -> b -> Referent' termRef a -> b
$cfoldl :: forall termRef b a. (b -> a -> b) -> b -> Referent' termRef a -> b
foldl :: forall b a. (b -> a -> b) -> b -> Referent' termRef a -> b
$cfoldl' :: forall termRef b a. (b -> a -> b) -> b -> Referent' termRef a -> b
foldl' :: forall b a. (b -> a -> b) -> b -> Referent' termRef a -> b
$cfoldr1 :: forall termRef a. (a -> a -> a) -> Referent' termRef a -> a
foldr1 :: forall a. (a -> a -> a) -> Referent' termRef a -> a
$cfoldl1 :: forall termRef a. (a -> a -> a) -> Referent' termRef a -> a
foldl1 :: forall a. (a -> a -> a) -> Referent' termRef a -> a
$ctoList :: forall termRef a. Referent' termRef a -> [a]
toList :: forall a. Referent' termRef a -> [a]
$cnull :: forall termRef a. Referent' termRef a -> Bool
null :: forall a. Referent' termRef a -> Bool
$clength :: forall termRef a. Referent' termRef a -> Int
length :: forall a. Referent' termRef a -> Int
$celem :: forall termRef a. Eq a => a -> Referent' termRef a -> Bool
elem :: forall a. Eq a => a -> Referent' termRef a -> Bool
$cmaximum :: forall termRef a. Ord a => Referent' termRef a -> a
maximum :: forall a. Ord a => Referent' termRef a -> a
$cminimum :: forall termRef a. Ord a => Referent' termRef a -> a
minimum :: forall a. Ord a => Referent' termRef a -> a
$csum :: forall termRef a. Num a => Referent' termRef a -> a
sum :: forall a. Num a => Referent' termRef a -> a
$cproduct :: forall termRef a. Num a => Referent' termRef a -> a
product :: forall a. Num a => Referent' termRef a -> a
Foldable, Functor (Referent' termRef)
Foldable (Referent' termRef)
(Functor (Referent' termRef), Foldable (Referent' termRef)) =>
(forall (f :: * -> *) a b.
 Applicative f =>
 (a -> f b) -> Referent' termRef a -> f (Referent' termRef b))
-> (forall (f :: * -> *) a.
    Applicative f =>
    Referent' termRef (f a) -> f (Referent' termRef a))
-> (forall (m :: * -> *) a b.
    Monad m =>
    (a -> m b) -> Referent' termRef a -> m (Referent' termRef b))
-> (forall (m :: * -> *) a.
    Monad m =>
    Referent' termRef (m a) -> m (Referent' termRef a))
-> Traversable (Referent' termRef)
forall termRef. Functor (Referent' termRef)
forall termRef. Foldable (Referent' termRef)
forall termRef (m :: * -> *) a.
Monad m =>
Referent' termRef (m a) -> m (Referent' termRef a)
forall termRef (f :: * -> *) a.
Applicative f =>
Referent' termRef (f a) -> f (Referent' termRef a)
forall termRef (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Referent' termRef a -> m (Referent' termRef b)
forall termRef (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Referent' termRef a -> f (Referent' termRef 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 =>
Referent' termRef (m a) -> m (Referent' termRef a)
forall (f :: * -> *) a.
Applicative f =>
Referent' termRef (f a) -> f (Referent' termRef a)
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Referent' termRef a -> m (Referent' termRef b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Referent' termRef a -> f (Referent' termRef b)
$ctraverse :: forall termRef (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Referent' termRef a -> f (Referent' termRef b)
traverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Referent' termRef a -> f (Referent' termRef b)
$csequenceA :: forall termRef (f :: * -> *) a.
Applicative f =>
Referent' termRef (f a) -> f (Referent' termRef a)
sequenceA :: forall (f :: * -> *) a.
Applicative f =>
Referent' termRef (f a) -> f (Referent' termRef a)
$cmapM :: forall termRef (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Referent' termRef a -> m (Referent' termRef b)
mapM :: forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Referent' termRef a -> m (Referent' termRef b)
$csequence :: forall termRef (m :: * -> *) a.
Monad m =>
Referent' termRef (m a) -> m (Referent' termRef a)
sequence :: forall (m :: * -> *) a.
Monad m =>
Referent' termRef (m a) -> m (Referent' termRef a)
Traversable)

refs_ :: Traversal (Referent' ref ref) (Referent' ref' ref') ref ref'
refs_ :: forall ref ref' (f :: * -> *).
Applicative f =>
(ref -> f ref') -> Referent' ref ref -> f (Referent' ref' ref')
refs_ ref -> f ref'
f Referent' ref ref
r = (ref -> f ref')
-> (ref -> f ref') -> Referent' ref ref -> f (Referent' ref' ref')
forall (f :: * -> *) a c b d.
Applicative f =>
(a -> f c) -> (b -> f d) -> Referent' a b -> f (Referent' c d)
forall (t :: * -> * -> *) (f :: * -> *) a c b d.
(Bitraversable t, Applicative f) =>
(a -> f c) -> (b -> f d) -> t a b -> f (t c d)
bitraverse ref -> f ref'
f ref -> f ref'
f Referent' ref ref
r

typeRef_ :: Traversal (Referent' termRef typeRef) (Referent' termRef typeRef') typeRef typeRef'
typeRef_ :: forall termRef typeRef typeRef' (f :: * -> *).
Applicative f =>
(typeRef -> f typeRef')
-> Referent' termRef typeRef -> f (Referent' termRef typeRef')
typeRef_ typeRef -> f typeRef'
f = (termRef -> f termRef)
-> (typeRef -> f typeRef')
-> Referent' termRef typeRef
-> f (Referent' termRef typeRef')
forall (f :: * -> *) a c b d.
Applicative f =>
(a -> f c) -> (b -> f d) -> Referent' a b -> f (Referent' c d)
forall (t :: * -> * -> *) (f :: * -> *) a c b d.
(Bitraversable t, Applicative f) =>
(a -> f c) -> (b -> f d) -> t a b -> f (t c d)
bitraverse termRef -> f termRef
forall a. a -> f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure typeRef -> f typeRef'
f

termRef_ :: Traversal (Referent' termRef typeRef) (Referent' termRef' typeRef) termRef termRef'
termRef_ :: forall termRef typeRef termRef' (f :: * -> *).
Applicative f =>
(termRef -> f termRef')
-> Referent' termRef typeRef -> f (Referent' termRef' typeRef)
termRef_ termRef -> f termRef'
f = (termRef -> f termRef')
-> (typeRef -> f typeRef)
-> Referent' termRef typeRef
-> f (Referent' termRef' typeRef)
forall (f :: * -> *) a c b d.
Applicative f =>
(a -> f c) -> (b -> f d) -> Referent' a b -> f (Referent' c d)
forall (t :: * -> * -> *) (f :: * -> *) a c b d.
(Bitraversable t, Applicative f) =>
(a -> f c) -> (b -> f d) -> t a b -> f (t c d)
bitraverse termRef -> f termRef'
f typeRef -> f typeRef
forall a. a -> f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure

_Ref :: Prism (Referent' tmr tyr) (Referent' tmr' tyr) tmr tmr'
_Ref :: forall tmr tyr tmr' (p :: * -> * -> *) (f :: * -> *).
(Choice p, Applicative f) =>
p tmr (f tmr') -> p (Referent' tmr tyr) (f (Referent' tmr' tyr))
_Ref = forall (ctor :: Symbol) s t a b.
AsConstructor ctor s t a b =>
Prism s t a b
_Ctor @"Ref"

_Con :: Prism (Referent' tmr tyr) (Referent' tmr tyr') (tyr, ConstructorId) (tyr', ConstructorId)
_Con :: forall tmr tyr tyr' (p :: * -> * -> *) (f :: * -> *).
(Choice p, Applicative f) =>
p (tyr, ConstructorId) (f (tyr', ConstructorId))
-> p (Referent' tmr tyr) (f (Referent' tmr tyr'))
_Con = forall (ctor :: Symbol) s t a b.
AsConstructor ctor s t a b =>
Prism s t a b
_Ctor @"Con"

toReference :: Referent -> Reference
toReference :: Referent -> Reference
toReference = \case
  Ref Reference
termRef -> Reference
termRef
  Con Reference
typeRef ConstructorId
_ -> Reference
typeRef

toReferenceId :: Referent -> Maybe Reference.Id
toReferenceId :: Referent -> Maybe Id
toReferenceId = \case
  Ref Reference
termRef -> Reference -> Maybe Id
Reference.toId Reference
termRef
  Con Reference
typeRef ConstructorId
_ -> Reference -> Maybe Id
Reference.toId Reference
typeRef

toTermReference :: Referent' termRef typeRef -> Maybe termRef
toTermReference :: forall termRef typeRef. Referent' termRef typeRef -> Maybe termRef
toTermReference = \case
  Ref termRef
termRef -> termRef -> Maybe termRef
forall a. a -> Maybe a
Just termRef
termRef
  Con typeRef
_ ConstructorId
_ -> Maybe termRef
forall a. Maybe a
Nothing

type Id = Id' Hash Hash

data Id' hTm hTp
  = RefId (Reference.Id' hTm)
  | ConId (Reference.Id' hTp) ConstructorId
  deriving (Id' hTm hTp -> Id' hTm hTp -> Bool
(Id' hTm hTp -> Id' hTm hTp -> Bool)
-> (Id' hTm hTp -> Id' hTm hTp -> Bool) -> Eq (Id' hTm hTp)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall hTm hTp.
(Eq hTm, Eq hTp) =>
Id' hTm hTp -> Id' hTm hTp -> Bool
$c== :: forall hTm hTp.
(Eq hTm, Eq hTp) =>
Id' hTm hTp -> Id' hTm hTp -> Bool
== :: Id' hTm hTp -> Id' hTm hTp -> Bool
$c/= :: forall hTm hTp.
(Eq hTm, Eq hTp) =>
Id' hTm hTp -> Id' hTm hTp -> Bool
/= :: Id' hTm hTp -> Id' hTm hTp -> Bool
Eq, (forall a b. (a -> b) -> Id' hTm a -> Id' hTm b)
-> (forall a b. a -> Id' hTm b -> Id' hTm a) -> Functor (Id' hTm)
forall a b. a -> Id' hTm b -> Id' hTm a
forall a b. (a -> b) -> Id' hTm a -> Id' hTm b
forall hTm a b. a -> Id' hTm b -> Id' hTm a
forall hTm a b. (a -> b) -> Id' hTm a -> Id' hTm b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall hTm a b. (a -> b) -> Id' hTm a -> Id' hTm b
fmap :: forall a b. (a -> b) -> Id' hTm a -> Id' hTm b
$c<$ :: forall hTm a b. a -> Id' hTm b -> Id' hTm a
<$ :: forall a b. a -> Id' hTm b -> Id' hTm a
Functor, Eq (Id' hTm hTp)
Eq (Id' hTm hTp) =>
(Id' hTm hTp -> Id' hTm hTp -> Ordering)
-> (Id' hTm hTp -> Id' hTm hTp -> Bool)
-> (Id' hTm hTp -> Id' hTm hTp -> Bool)
-> (Id' hTm hTp -> Id' hTm hTp -> Bool)
-> (Id' hTm hTp -> Id' hTm hTp -> Bool)
-> (Id' hTm hTp -> Id' hTm hTp -> Id' hTm hTp)
-> (Id' hTm hTp -> Id' hTm hTp -> Id' hTm hTp)
-> Ord (Id' hTm hTp)
Id' hTm hTp -> Id' hTm hTp -> Bool
Id' hTm hTp -> Id' hTm hTp -> Ordering
Id' hTm hTp -> Id' hTm hTp -> Id' hTm hTp
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 hTm hTp. (Ord hTm, Ord hTp) => Eq (Id' hTm hTp)
forall hTm hTp.
(Ord hTm, Ord hTp) =>
Id' hTm hTp -> Id' hTm hTp -> Bool
forall hTm hTp.
(Ord hTm, Ord hTp) =>
Id' hTm hTp -> Id' hTm hTp -> Ordering
forall hTm hTp.
(Ord hTm, Ord hTp) =>
Id' hTm hTp -> Id' hTm hTp -> Id' hTm hTp
$ccompare :: forall hTm hTp.
(Ord hTm, Ord hTp) =>
Id' hTm hTp -> Id' hTm hTp -> Ordering
compare :: Id' hTm hTp -> Id' hTm hTp -> Ordering
$c< :: forall hTm hTp.
(Ord hTm, Ord hTp) =>
Id' hTm hTp -> Id' hTm hTp -> Bool
< :: Id' hTm hTp -> Id' hTm hTp -> Bool
$c<= :: forall hTm hTp.
(Ord hTm, Ord hTp) =>
Id' hTm hTp -> Id' hTm hTp -> Bool
<= :: Id' hTm hTp -> Id' hTm hTp -> Bool
$c> :: forall hTm hTp.
(Ord hTm, Ord hTp) =>
Id' hTm hTp -> Id' hTm hTp -> Bool
> :: Id' hTm hTp -> Id' hTm hTp -> Bool
$c>= :: forall hTm hTp.
(Ord hTm, Ord hTp) =>
Id' hTm hTp -> Id' hTm hTp -> Bool
>= :: Id' hTm hTp -> Id' hTm hTp -> Bool
$cmax :: forall hTm hTp.
(Ord hTm, Ord hTp) =>
Id' hTm hTp -> Id' hTm hTp -> Id' hTm hTp
max :: Id' hTm hTp -> Id' hTm hTp -> Id' hTm hTp
$cmin :: forall hTm hTp.
(Ord hTm, Ord hTp) =>
Id' hTm hTp -> Id' hTm hTp -> Id' hTm hTp
min :: Id' hTm hTp -> Id' hTm hTp -> Id' hTm hTp
Ord, Int -> Id' hTm hTp -> ShowS
[Id' hTm hTp] -> ShowS
Id' hTm hTp -> String
(Int -> Id' hTm hTp -> ShowS)
-> (Id' hTm hTp -> String)
-> ([Id' hTm hTp] -> ShowS)
-> Show (Id' hTm hTp)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall hTm hTp. (Show hTm, Show hTp) => Int -> Id' hTm hTp -> ShowS
forall hTm hTp. (Show hTm, Show hTp) => [Id' hTm hTp] -> ShowS
forall hTm hTp. (Show hTm, Show hTp) => Id' hTm hTp -> String
$cshowsPrec :: forall hTm hTp. (Show hTm, Show hTp) => Int -> Id' hTm hTp -> ShowS
showsPrec :: Int -> Id' hTm hTp -> ShowS
$cshow :: forall hTm hTp. (Show hTm, Show hTp) => Id' hTm hTp -> String
show :: Id' hTm hTp -> String
$cshowList :: forall hTm hTp. (Show hTm, Show hTp) => [Id' hTm hTp] -> ShowS
showList :: [Id' hTm hTp] -> ShowS
Show)

instance Bifunctor Referent' where
  bimap :: forall a b c d.
(a -> b) -> (c -> d) -> Referent' a c -> Referent' b d
bimap a -> b
f c -> d
g = \case
    Ref a
r -> b -> Referent' b d
forall termRef typeRef. termRef -> Referent' termRef typeRef
Ref (a -> b
f a
r)
    Con c
r ConstructorId
i -> d -> ConstructorId -> Referent' b d
forall termRef typeRef.
typeRef -> ConstructorId -> Referent' termRef typeRef
Con (c -> d
g c
r) ConstructorId
i

instance Bifoldable Referent' where
  bifoldMap :: forall m a b.
Monoid m =>
(a -> m) -> (b -> m) -> Referent' a b -> m
bifoldMap a -> m
f b -> m
g = \case
    Ref a
r -> a -> m
f a
r
    Con b
r ConstructorId
_ -> b -> m
g b
r

instance Bitraversable Referent' where
  bitraverse :: forall (f :: * -> *) a c b d.
Applicative f =>
(a -> f c) -> (b -> f d) -> Referent' a b -> f (Referent' c d)
bitraverse a -> f c
f b -> f d
g = \case
    Ref a
r -> c -> Referent' c d
forall termRef typeRef. termRef -> Referent' termRef typeRef
Ref (c -> Referent' c d) -> f c -> f (Referent' c d)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> f c
f a
r
    Con b
r ConstructorId
c -> (d -> ConstructorId -> Referent' c d)
-> ConstructorId -> d -> Referent' c d
forall a b c. (a -> b -> c) -> b -> a -> c
flip d -> ConstructorId -> Referent' c d
forall termRef typeRef.
typeRef -> ConstructorId -> Referent' termRef typeRef
Con ConstructorId
c (d -> Referent' c d) -> f d -> f (Referent' c d)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> b -> f d
g b
r

instance Bifunctor Id' where
  bimap :: forall a b c d. (a -> b) -> (c -> d) -> Id' a c -> Id' b d
bimap a -> b
f c -> d
g = \case
    RefId Id' a
r -> Id' b -> Id' b d
forall hTm hTp. Id' hTm -> Id' hTm hTp
RefId ((a -> b) -> Id' a -> Id' b
forall a b. (a -> b) -> Id' a -> Id' b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f Id' a
r)
    ConId Id' c
r ConstructorId
j -> Id' d -> ConstructorId -> Id' b d
forall hTm hTp. Id' hTp -> ConstructorId -> Id' hTm hTp
ConId ((c -> d) -> Id' c -> Id' d
forall a b. (a -> b) -> Id' a -> Id' b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap c -> d
g Id' c
r) ConstructorId
j

instance Bifoldable Id' where
  bifoldMap :: forall m a b. Monoid m => (a -> m) -> (b -> m) -> Id' a b -> m
bifoldMap a -> m
f b -> m
g = \case
    RefId Id' a
r -> (a -> m) -> Id' a -> m
forall m a. Monoid m => (a -> m) -> Id' a -> m
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap a -> m
f Id' a
r
    ConId Id' b
r ConstructorId
_ -> (b -> m) -> Id' b -> m
forall m a. Monoid m => (a -> m) -> Id' a -> m
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap b -> m
g Id' b
r

instance Bitraversable Id' where
  bitraverse :: forall (f :: * -> *) a c b d.
Applicative f =>
(a -> f c) -> (b -> f d) -> Id' a b -> f (Id' c d)
bitraverse a -> f c
f b -> f d
g = \case
    RefId Id' a
r -> Id' c -> Id' c d
forall hTm hTp. Id' hTm -> Id' hTm hTp
RefId (Id' c -> Id' c d) -> f (Id' c) -> f (Id' c d)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (a -> f c) -> Id' a -> f (Id' c)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Id' a -> f (Id' b)
traverse a -> f c
f Id' a
r
    ConId Id' b
r ConstructorId
c -> (Id' d -> ConstructorId -> Id' c d)
-> ConstructorId -> Id' d -> Id' c d
forall a b c. (a -> b -> c) -> b -> a -> c
flip Id' d -> ConstructorId -> Id' c d
forall hTm hTp. Id' hTp -> ConstructorId -> Id' hTm hTp
ConId ConstructorId
c (Id' d -> Id' c d) -> f (Id' d) -> f (Id' c d)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (b -> f d) -> Id' b -> f (Id' d)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Id' a -> f (Id' b)
traverse b -> f d
g Id' b
r

toShortHash :: Referent -> ShortHash
toShortHash :: Referent -> ShortHash
toShortHash = \case
  Ref Reference
r -> Reference -> ShortHash
Reference.toShortHash Reference
r
  Con Reference
r ConstructorId
conId ->
    case Reference -> ShortHash
Reference.toShortHash Reference
r of
      SH.Builtin Text
b -> Text -> ShortHash
SH.Builtin Text
b
      SH.ShortHash Text
prefix Maybe ConstructorId
cycle Maybe ConstructorId
_cid -> Text -> Maybe ConstructorId -> Maybe ConstructorId -> ShortHash
SH.ShortHash Text
prefix Maybe ConstructorId
cycle (ConstructorId -> Maybe ConstructorId
forall a. a -> Maybe a
Just ConstructorId
conId)