module Unison.KindInference.Constraint.Provenance
  ( Provenance (..),
    loc,
  )
where

import Control.Lens (Lens')
import Unison.KindInference.Constraint.Context (ConstraintContext (..))

-- | A tag for a source span and context indicating where the
-- generated constraint came from. This is helpful to propagate the
-- constraint context through the solver for user-facing error
-- messages.
data Provenance v loc
  = Provenance !(ConstraintContext v loc) !loc
  deriving stock (Int -> Provenance v loc -> ShowS
[Provenance v loc] -> ShowS
Provenance v loc -> String
(Int -> Provenance v loc -> ShowS)
-> (Provenance v loc -> String)
-> ([Provenance v loc] -> ShowS)
-> Show (Provenance v loc)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall v loc.
(Show v, Show loc) =>
Int -> Provenance v loc -> ShowS
forall v loc. (Show v, Show loc) => [Provenance v loc] -> ShowS
forall v loc. (Show v, Show loc) => Provenance v loc -> String
$cshowsPrec :: forall v loc.
(Show v, Show loc) =>
Int -> Provenance v loc -> ShowS
showsPrec :: Int -> Provenance v loc -> ShowS
$cshow :: forall v loc. (Show v, Show loc) => Provenance v loc -> String
show :: Provenance v loc -> String
$cshowList :: forall v loc. (Show v, Show loc) => [Provenance v loc] -> ShowS
showList :: [Provenance v loc] -> ShowS
Show, Provenance v loc -> Provenance v loc -> Bool
(Provenance v loc -> Provenance v loc -> Bool)
-> (Provenance v loc -> Provenance v loc -> Bool)
-> Eq (Provenance v loc)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall v loc.
(Var v, Eq loc) =>
Provenance v loc -> Provenance v loc -> Bool
$c== :: forall v loc.
(Var v, Eq loc) =>
Provenance v loc -> Provenance v loc -> Bool
== :: Provenance v loc -> Provenance v loc -> Bool
$c/= :: forall v loc.
(Var v, Eq loc) =>
Provenance v loc -> Provenance v loc -> Bool
/= :: Provenance v loc -> Provenance v loc -> Bool
Eq, Eq (Provenance v loc)
Eq (Provenance v loc) =>
(Provenance v loc -> Provenance v loc -> Ordering)
-> (Provenance v loc -> Provenance v loc -> Bool)
-> (Provenance v loc -> Provenance v loc -> Bool)
-> (Provenance v loc -> Provenance v loc -> Bool)
-> (Provenance v loc -> Provenance v loc -> Bool)
-> (Provenance v loc -> Provenance v loc -> Provenance v loc)
-> (Provenance v loc -> Provenance v loc -> Provenance v loc)
-> Ord (Provenance v loc)
Provenance v loc -> Provenance v loc -> Bool
Provenance v loc -> Provenance v loc -> Ordering
Provenance v loc -> Provenance v loc -> Provenance 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 (Provenance v loc)
forall v loc.
(Var v, Ord loc) =>
Provenance v loc -> Provenance v loc -> Bool
forall v loc.
(Var v, Ord loc) =>
Provenance v loc -> Provenance v loc -> Ordering
forall v loc.
(Var v, Ord loc) =>
Provenance v loc -> Provenance v loc -> Provenance v loc
$ccompare :: forall v loc.
(Var v, Ord loc) =>
Provenance v loc -> Provenance v loc -> Ordering
compare :: Provenance v loc -> Provenance v loc -> Ordering
$c< :: forall v loc.
(Var v, Ord loc) =>
Provenance v loc -> Provenance v loc -> Bool
< :: Provenance v loc -> Provenance v loc -> Bool
$c<= :: forall v loc.
(Var v, Ord loc) =>
Provenance v loc -> Provenance v loc -> Bool
<= :: Provenance v loc -> Provenance v loc -> Bool
$c> :: forall v loc.
(Var v, Ord loc) =>
Provenance v loc -> Provenance v loc -> Bool
> :: Provenance v loc -> Provenance v loc -> Bool
$c>= :: forall v loc.
(Var v, Ord loc) =>
Provenance v loc -> Provenance v loc -> Bool
>= :: Provenance v loc -> Provenance v loc -> Bool
$cmax :: forall v loc.
(Var v, Ord loc) =>
Provenance v loc -> Provenance v loc -> Provenance v loc
max :: Provenance v loc -> Provenance v loc -> Provenance v loc
$cmin :: forall v loc.
(Var v, Ord loc) =>
Provenance v loc -> Provenance v loc -> Provenance v loc
min :: Provenance v loc -> Provenance v loc -> Provenance v loc
Ord)

loc :: Lens' (Provenance v loc) loc
loc :: forall v loc (f :: * -> *).
Functor f =>
(loc -> f loc) -> Provenance v loc -> f (Provenance v loc)
loc loc -> f loc
f = \case
  Provenance ConstraintContext v loc
ctx loc
x -> ConstraintContext v loc -> loc -> Provenance v loc
forall v loc. ConstraintContext v loc -> loc -> Provenance v loc
Provenance ConstraintContext v loc
ctx (loc -> Provenance v loc) -> f loc -> f (Provenance v loc)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> loc -> f loc
f loc
x
{-# INLINE loc #-}