module Unison.KindInference.Constraint.TypeProvenance
  ( TypeProvenance (..),
    prov,
  )
where

import Control.Lens (Traversal)
import Unison.KindInference.Constraint.Provenance (Provenance)

-- | Provenance of an @IsType@ constraint. @IsType@ constraints arise
-- in constraint generation (in which case it will have a
-- @Provenance@) and also in the solver through kind-defaulting on
-- unconstrained unification variables.
data TypeProvenance v loc
  = NotDefault (Provenance v loc)
  | Default
  deriving stock (Int -> TypeProvenance v loc -> ShowS
[TypeProvenance v loc] -> ShowS
TypeProvenance v loc -> String
(Int -> TypeProvenance v loc -> ShowS)
-> (TypeProvenance v loc -> String)
-> ([TypeProvenance v loc] -> ShowS)
-> Show (TypeProvenance v loc)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall v loc.
(Show v, Show loc) =>
Int -> TypeProvenance v loc -> ShowS
forall v loc. (Show v, Show loc) => [TypeProvenance v loc] -> ShowS
forall v loc. (Show v, Show loc) => TypeProvenance v loc -> String
$cshowsPrec :: forall v loc.
(Show v, Show loc) =>
Int -> TypeProvenance v loc -> ShowS
showsPrec :: Int -> TypeProvenance v loc -> ShowS
$cshow :: forall v loc. (Show v, Show loc) => TypeProvenance v loc -> String
show :: TypeProvenance v loc -> String
$cshowList :: forall v loc. (Show v, Show loc) => [TypeProvenance v loc] -> ShowS
showList :: [TypeProvenance v loc] -> ShowS
Show, TypeProvenance v loc -> TypeProvenance v loc -> Bool
(TypeProvenance v loc -> TypeProvenance v loc -> Bool)
-> (TypeProvenance v loc -> TypeProvenance v loc -> Bool)
-> Eq (TypeProvenance v loc)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall v loc.
(Var v, Eq loc) =>
TypeProvenance v loc -> TypeProvenance v loc -> Bool
$c== :: forall v loc.
(Var v, Eq loc) =>
TypeProvenance v loc -> TypeProvenance v loc -> Bool
== :: TypeProvenance v loc -> TypeProvenance v loc -> Bool
$c/= :: forall v loc.
(Var v, Eq loc) =>
TypeProvenance v loc -> TypeProvenance v loc -> Bool
/= :: TypeProvenance v loc -> TypeProvenance v loc -> Bool
Eq, Eq (TypeProvenance v loc)
Eq (TypeProvenance v loc) =>
(TypeProvenance v loc -> TypeProvenance v loc -> Ordering)
-> (TypeProvenance v loc -> TypeProvenance v loc -> Bool)
-> (TypeProvenance v loc -> TypeProvenance v loc -> Bool)
-> (TypeProvenance v loc -> TypeProvenance v loc -> Bool)
-> (TypeProvenance v loc -> TypeProvenance v loc -> Bool)
-> (TypeProvenance v loc
    -> TypeProvenance v loc -> TypeProvenance v loc)
-> (TypeProvenance v loc
    -> TypeProvenance v loc -> TypeProvenance v loc)
-> Ord (TypeProvenance v loc)
TypeProvenance v loc -> TypeProvenance v loc -> Bool
TypeProvenance v loc -> TypeProvenance v loc -> Ordering
TypeProvenance v loc
-> TypeProvenance v loc -> TypeProvenance v loc
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 v loc. (Var v, Ord loc) => Eq (TypeProvenance v loc)
forall v loc.
(Var v, Ord loc) =>
TypeProvenance v loc -> TypeProvenance v loc -> Bool
forall v loc.
(Var v, Ord loc) =>
TypeProvenance v loc -> TypeProvenance v loc -> Ordering
forall v loc.
(Var v, Ord loc) =>
TypeProvenance v loc
-> TypeProvenance v loc -> TypeProvenance v loc
$ccompare :: forall v loc.
(Var v, Ord loc) =>
TypeProvenance v loc -> TypeProvenance v loc -> Ordering
compare :: TypeProvenance v loc -> TypeProvenance v loc -> Ordering
$c< :: forall v loc.
(Var v, Ord loc) =>
TypeProvenance v loc -> TypeProvenance v loc -> Bool
< :: TypeProvenance v loc -> TypeProvenance v loc -> Bool
$c<= :: forall v loc.
(Var v, Ord loc) =>
TypeProvenance v loc -> TypeProvenance v loc -> Bool
<= :: TypeProvenance v loc -> TypeProvenance v loc -> Bool
$c> :: forall v loc.
(Var v, Ord loc) =>
TypeProvenance v loc -> TypeProvenance v loc -> Bool
> :: TypeProvenance v loc -> TypeProvenance v loc -> Bool
$c>= :: forall v loc.
(Var v, Ord loc) =>
TypeProvenance v loc -> TypeProvenance v loc -> Bool
>= :: TypeProvenance v loc -> TypeProvenance v loc -> Bool
$cmax :: forall v loc.
(Var v, Ord loc) =>
TypeProvenance v loc
-> TypeProvenance v loc -> TypeProvenance v loc
max :: TypeProvenance v loc
-> TypeProvenance v loc -> TypeProvenance v loc
$cmin :: forall v loc.
(Var v, Ord loc) =>
TypeProvenance v loc
-> TypeProvenance v loc -> TypeProvenance v loc
min :: TypeProvenance v loc
-> TypeProvenance v loc -> TypeProvenance v loc
Ord)

prov ::
  Traversal
    (TypeProvenance v loc)
    (TypeProvenance v loc')
    (Provenance v loc)
    (Provenance v loc')
prov :: forall v loc loc' (f :: * -> *).
Applicative f =>
(Provenance v loc -> f (Provenance v loc'))
-> TypeProvenance v loc -> f (TypeProvenance v loc')
prov Provenance v loc -> f (Provenance v loc')
f = \case
  TypeProvenance v loc
Default -> TypeProvenance v loc' -> f (TypeProvenance v loc')
forall a. a -> f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure TypeProvenance v loc'
forall v loc. TypeProvenance v loc
Default
  NotDefault Provenance v loc
p -> Provenance v loc' -> TypeProvenance v loc'
forall v loc. Provenance v loc -> TypeProvenance v loc
NotDefault (Provenance v loc' -> TypeProvenance v loc')
-> f (Provenance v loc') -> f (TypeProvenance v loc')
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Provenance v loc -> f (Provenance v loc')
f Provenance v loc
p
{-# INLINE prov #-}