-- editorconfig-checker-disable-file
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}

-- | Module handling provenances of terms.
module PlutusIR.Compiler.Provenance where

import PlutusIR

import PlutusCore.Annotation
import PlutusCore.Pretty qualified as PLC

import Data.Hashable
import Data.Set qualified as S
import GHC.Generics (Generic)
import Prettyprinter ((<+>))
import Prettyprinter qualified as PP

{-| Indicates where a value comes from.

This is either an original annotation or a pieces of context explaining how the term
relates to a previous 'Provenance'. We also provide 'noProvenance' for convenience.

The provenance should always be just the original annotation, if we have one. It should only be another
kind of provenance if we're in the process of generating some term that doesn't correspond directly to a term in
the original AST. -}
data Provenance a
  = Original a
  | LetBinding Recursivity (Provenance a)
  | TermBinding String (Provenance a)
  | TypeBinding String (Provenance a)
  | DatatypeComponent DatatypeComponent (Provenance a)
  | -- | Added for accumulating difference provenances when floating lets
    MultipleSources (S.Set (Provenance a))
  deriving stock (Int -> Provenance a -> ShowS
[Provenance a] -> ShowS
Provenance a -> String
(Int -> Provenance a -> ShowS)
-> (Provenance a -> String)
-> ([Provenance a] -> ShowS)
-> Show (Provenance a)
forall a. Show a => Int -> Provenance a -> ShowS
forall a. Show a => [Provenance a] -> ShowS
forall a. Show a => Provenance a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. Show a => Int -> Provenance a -> ShowS
showsPrec :: Int -> Provenance a -> ShowS
$cshow :: forall a. Show a => Provenance a -> String
show :: Provenance a -> String
$cshowList :: forall a. Show a => [Provenance a] -> ShowS
showList :: [Provenance a] -> ShowS
Show, Provenance a -> Provenance a -> Bool
(Provenance a -> Provenance a -> Bool)
-> (Provenance a -> Provenance a -> Bool) -> Eq (Provenance a)
forall a. Eq a => Provenance a -> Provenance a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. Eq a => Provenance a -> Provenance a -> Bool
== :: Provenance a -> Provenance a -> Bool
$c/= :: forall a. Eq a => Provenance a -> Provenance a -> Bool
/= :: Provenance a -> Provenance a -> Bool
Eq, Eq (Provenance a)
Eq (Provenance a) =>
(Provenance a -> Provenance a -> Ordering)
-> (Provenance a -> Provenance a -> Bool)
-> (Provenance a -> Provenance a -> Bool)
-> (Provenance a -> Provenance a -> Bool)
-> (Provenance a -> Provenance a -> Bool)
-> (Provenance a -> Provenance a -> Provenance a)
-> (Provenance a -> Provenance a -> Provenance a)
-> Ord (Provenance a)
Provenance a -> Provenance a -> Bool
Provenance a -> Provenance a -> Ordering
Provenance a -> Provenance a -> Provenance a
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 a. Ord a => Eq (Provenance a)
forall a. Ord a => Provenance a -> Provenance a -> Bool
forall a. Ord a => Provenance a -> Provenance a -> Ordering
forall a. Ord a => Provenance a -> Provenance a -> Provenance a
$ccompare :: forall a. Ord a => Provenance a -> Provenance a -> Ordering
compare :: Provenance a -> Provenance a -> Ordering
$c< :: forall a. Ord a => Provenance a -> Provenance a -> Bool
< :: Provenance a -> Provenance a -> Bool
$c<= :: forall a. Ord a => Provenance a -> Provenance a -> Bool
<= :: Provenance a -> Provenance a -> Bool
$c> :: forall a. Ord a => Provenance a -> Provenance a -> Bool
> :: Provenance a -> Provenance a -> Bool
$c>= :: forall a. Ord a => Provenance a -> Provenance a -> Bool
>= :: Provenance a -> Provenance a -> Bool
$cmax :: forall a. Ord a => Provenance a -> Provenance a -> Provenance a
max :: Provenance a -> Provenance a -> Provenance a
$cmin :: forall a. Ord a => Provenance a -> Provenance a -> Provenance a
min :: Provenance a -> Provenance a -> Provenance a
Ord, (forall m. Monoid m => Provenance m -> m)
-> (forall m a. Monoid m => (a -> m) -> Provenance a -> m)
-> (forall m a. Monoid m => (a -> m) -> Provenance a -> m)
-> (forall a b. (a -> b -> b) -> b -> Provenance a -> b)
-> (forall a b. (a -> b -> b) -> b -> Provenance a -> b)
-> (forall b a. (b -> a -> b) -> b -> Provenance a -> b)
-> (forall b a. (b -> a -> b) -> b -> Provenance a -> b)
-> (forall a. (a -> a -> a) -> Provenance a -> a)
-> (forall a. (a -> a -> a) -> Provenance a -> a)
-> (forall a. Provenance a -> [a])
-> (forall a. Provenance a -> Bool)
-> (forall a. Provenance a -> Int)
-> (forall a. Eq a => a -> Provenance a -> Bool)
-> (forall a. Ord a => Provenance a -> a)
-> (forall a. Ord a => Provenance a -> a)
-> (forall a. Num a => Provenance a -> a)
-> (forall a. Num a => Provenance a -> a)
-> Foldable Provenance
forall a. Eq a => a -> Provenance a -> Bool
forall a. Num a => Provenance a -> a
forall a. Ord a => Provenance a -> a
forall m. Monoid m => Provenance m -> m
forall a. Provenance a -> Bool
forall a. Provenance a -> Int
forall a. Provenance a -> [a]
forall a. (a -> a -> a) -> Provenance a -> a
forall m a. Monoid m => (a -> m) -> Provenance a -> m
forall b a. (b -> a -> b) -> b -> Provenance a -> b
forall a b. (a -> b -> b) -> b -> Provenance 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 m. Monoid m => Provenance m -> m
fold :: forall m. Monoid m => Provenance m -> m
$cfoldMap :: forall m a. Monoid m => (a -> m) -> Provenance a -> m
foldMap :: forall m a. Monoid m => (a -> m) -> Provenance a -> m
$cfoldMap' :: forall m a. Monoid m => (a -> m) -> Provenance a -> m
foldMap' :: forall m a. Monoid m => (a -> m) -> Provenance a -> m
$cfoldr :: forall a b. (a -> b -> b) -> b -> Provenance a -> b
foldr :: forall a b. (a -> b -> b) -> b -> Provenance a -> b
$cfoldr' :: forall a b. (a -> b -> b) -> b -> Provenance a -> b
foldr' :: forall a b. (a -> b -> b) -> b -> Provenance a -> b
$cfoldl :: forall b a. (b -> a -> b) -> b -> Provenance a -> b
foldl :: forall b a. (b -> a -> b) -> b -> Provenance a -> b
$cfoldl' :: forall b a. (b -> a -> b) -> b -> Provenance a -> b
foldl' :: forall b a. (b -> a -> b) -> b -> Provenance a -> b
$cfoldr1 :: forall a. (a -> a -> a) -> Provenance a -> a
foldr1 :: forall a. (a -> a -> a) -> Provenance a -> a
$cfoldl1 :: forall a. (a -> a -> a) -> Provenance a -> a
foldl1 :: forall a. (a -> a -> a) -> Provenance a -> a
$ctoList :: forall a. Provenance a -> [a]
toList :: forall a. Provenance a -> [a]
$cnull :: forall a. Provenance a -> Bool
null :: forall a. Provenance a -> Bool
$clength :: forall a. Provenance a -> Int
length :: forall a. Provenance a -> Int
$celem :: forall a. Eq a => a -> Provenance a -> Bool
elem :: forall a. Eq a => a -> Provenance a -> Bool
$cmaximum :: forall a. Ord a => Provenance a -> a
maximum :: forall a. Ord a => Provenance a -> a
$cminimum :: forall a. Ord a => Provenance a -> a
minimum :: forall a. Ord a => Provenance a -> a
$csum :: forall a. Num a => Provenance a -> a
sum :: forall a. Num a => Provenance a -> a
$cproduct :: forall a. Num a => Provenance a -> a
product :: forall a. Num a => Provenance a -> a
Foldable, (forall x. Provenance a -> Rep (Provenance a) x)
-> (forall x. Rep (Provenance a) x -> Provenance a)
-> Generic (Provenance a)
forall x. Rep (Provenance a) x -> Provenance a
forall x. Provenance a -> Rep (Provenance a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (Provenance a) x -> Provenance a
forall a x. Provenance a -> Rep (Provenance a) x
$cfrom :: forall a x. Provenance a -> Rep (Provenance a) x
from :: forall x. Provenance a -> Rep (Provenance a) x
$cto :: forall a x. Rep (Provenance a) x -> Provenance a
to :: forall x. Rep (Provenance a) x -> Provenance a
Generic)
  deriving anyclass (Eq (Provenance a)
Eq (Provenance a) =>
(Int -> Provenance a -> Int)
-> (Provenance a -> Int) -> Hashable (Provenance a)
Int -> Provenance a -> Int
Provenance a -> Int
forall a. Eq a => (Int -> a -> Int) -> (a -> Int) -> Hashable a
forall a. Hashable a => Eq (Provenance a)
forall a. Hashable a => Int -> Provenance a -> Int
forall a. Hashable a => Provenance a -> Int
$chashWithSalt :: forall a. Hashable a => Int -> Provenance a -> Int
hashWithSalt :: Int -> Provenance a -> Int
$chash :: forall a. Hashable a => Provenance a -> Int
hash :: Provenance a -> Int
Hashable)

instance Ord a => Semigroup (Provenance a) where
  Provenance a
x <> :: Provenance a -> Provenance a -> Provenance a
<> Provenance a
y = Set (Provenance a) -> Provenance a
forall a. Set (Provenance a) -> Provenance a
MultipleSources (Provenance a -> Set (Provenance a)
forall {a}. Provenance a -> Set (Provenance a)
toSet Provenance a
x Set (Provenance a) -> Set (Provenance a) -> Set (Provenance a)
forall a. Ord a => Set a -> Set a -> Set a
`S.union` Provenance a -> Set (Provenance a)
forall {a}. Provenance a -> Set (Provenance a)
toSet Provenance a
y)
    where
      toSet :: Provenance a -> Set (Provenance a)
toSet = \case
        MultipleSources Set (Provenance a)
ps -> Set (Provenance a)
ps
        Provenance a
other -> Provenance a -> Set (Provenance a)
forall a. a -> Set a
S.singleton Provenance a
other

instance Ord a => Monoid (Provenance a) where
  mempty :: Provenance a
mempty = Provenance a
forall a. Provenance a
noProvenance

-- workaround, use a smart constructor to replace the older NoProvenance data constructor
noProvenance :: Provenance a
noProvenance :: forall a. Provenance a
noProvenance = Set (Provenance a) -> Provenance a
forall a. Set (Provenance a) -> Provenance a
MultipleSources Set (Provenance a)
forall a. Set a
S.empty

instance AnnInline a => AnnInline (Provenance a) where
  annAlwaysInline :: Provenance a
annAlwaysInline = a -> Provenance a
forall a. a -> Provenance a
Original a
forall a. AnnInline a => a
annAlwaysInline
  annSafeToInline :: Provenance a
annSafeToInline = a -> Provenance a
forall a. a -> Provenance a
Original a
forall a. AnnInline a => a
annSafeToInline
  annMayInline :: Provenance a
annMayInline = a -> Provenance a
forall a. a -> Provenance a
Original a
forall a. AnnInline a => a
annMayInline

data DatatypeComponent
  = Constructor
  | ConstructorType
  | Destructor
  | DestructorType
  | DatatypeType
  | PatternFunctor
  deriving stock (Int -> DatatypeComponent -> ShowS
[DatatypeComponent] -> ShowS
DatatypeComponent -> String
(Int -> DatatypeComponent -> ShowS)
-> (DatatypeComponent -> String)
-> ([DatatypeComponent] -> ShowS)
-> Show DatatypeComponent
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> DatatypeComponent -> ShowS
showsPrec :: Int -> DatatypeComponent -> ShowS
$cshow :: DatatypeComponent -> String
show :: DatatypeComponent -> String
$cshowList :: [DatatypeComponent] -> ShowS
showList :: [DatatypeComponent] -> ShowS
Show, DatatypeComponent -> DatatypeComponent -> Bool
(DatatypeComponent -> DatatypeComponent -> Bool)
-> (DatatypeComponent -> DatatypeComponent -> Bool)
-> Eq DatatypeComponent
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: DatatypeComponent -> DatatypeComponent -> Bool
== :: DatatypeComponent -> DatatypeComponent -> Bool
$c/= :: DatatypeComponent -> DatatypeComponent -> Bool
/= :: DatatypeComponent -> DatatypeComponent -> Bool
Eq, Eq DatatypeComponent
Eq DatatypeComponent =>
(DatatypeComponent -> DatatypeComponent -> Ordering)
-> (DatatypeComponent -> DatatypeComponent -> Bool)
-> (DatatypeComponent -> DatatypeComponent -> Bool)
-> (DatatypeComponent -> DatatypeComponent -> Bool)
-> (DatatypeComponent -> DatatypeComponent -> Bool)
-> (DatatypeComponent -> DatatypeComponent -> DatatypeComponent)
-> (DatatypeComponent -> DatatypeComponent -> DatatypeComponent)
-> Ord DatatypeComponent
DatatypeComponent -> DatatypeComponent -> Bool
DatatypeComponent -> DatatypeComponent -> Ordering
DatatypeComponent -> DatatypeComponent -> DatatypeComponent
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 :: DatatypeComponent -> DatatypeComponent -> Ordering
compare :: DatatypeComponent -> DatatypeComponent -> Ordering
$c< :: DatatypeComponent -> DatatypeComponent -> Bool
< :: DatatypeComponent -> DatatypeComponent -> Bool
$c<= :: DatatypeComponent -> DatatypeComponent -> Bool
<= :: DatatypeComponent -> DatatypeComponent -> Bool
$c> :: DatatypeComponent -> DatatypeComponent -> Bool
> :: DatatypeComponent -> DatatypeComponent -> Bool
$c>= :: DatatypeComponent -> DatatypeComponent -> Bool
>= :: DatatypeComponent -> DatatypeComponent -> Bool
$cmax :: DatatypeComponent -> DatatypeComponent -> DatatypeComponent
max :: DatatypeComponent -> DatatypeComponent -> DatatypeComponent
$cmin :: DatatypeComponent -> DatatypeComponent -> DatatypeComponent
min :: DatatypeComponent -> DatatypeComponent -> DatatypeComponent
Ord, (forall x. DatatypeComponent -> Rep DatatypeComponent x)
-> (forall x. Rep DatatypeComponent x -> DatatypeComponent)
-> Generic DatatypeComponent
forall x. Rep DatatypeComponent x -> DatatypeComponent
forall x. DatatypeComponent -> Rep DatatypeComponent x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. DatatypeComponent -> Rep DatatypeComponent x
from :: forall x. DatatypeComponent -> Rep DatatypeComponent x
$cto :: forall x. Rep DatatypeComponent x -> DatatypeComponent
to :: forall x. Rep DatatypeComponent x -> DatatypeComponent
Generic)
  deriving anyclass (Eq DatatypeComponent
Eq DatatypeComponent =>
(Int -> DatatypeComponent -> Int)
-> (DatatypeComponent -> Int) -> Hashable DatatypeComponent
Int -> DatatypeComponent -> Int
DatatypeComponent -> Int
forall a. Eq a => (Int -> a -> Int) -> (a -> Int) -> Hashable a
$chashWithSalt :: Int -> DatatypeComponent -> Int
hashWithSalt :: Int -> DatatypeComponent -> Int
$chash :: DatatypeComponent -> Int
hash :: DatatypeComponent -> Int
Hashable)

instance PP.Pretty DatatypeComponent where
  pretty :: forall ann. DatatypeComponent -> Doc ann
pretty = \case
    DatatypeComponent
Constructor -> Doc ann
"constructor"
    DatatypeComponent
ConstructorType -> Doc ann
"constructor type"
    DatatypeComponent
Destructor -> Doc ann
"destructor"
    DatatypeComponent
DestructorType -> Doc ann
"destructor type"
    DatatypeComponent
DatatypeType -> Doc ann
"datatype type"
    DatatypeComponent
PatternFunctor -> Doc ann
"pattern functor"

data GeneratedKind = RecursiveLet
  deriving stock (Int -> GeneratedKind -> ShowS
[GeneratedKind] -> ShowS
GeneratedKind -> String
(Int -> GeneratedKind -> ShowS)
-> (GeneratedKind -> String)
-> ([GeneratedKind] -> ShowS)
-> Show GeneratedKind
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> GeneratedKind -> ShowS
showsPrec :: Int -> GeneratedKind -> ShowS
$cshow :: GeneratedKind -> String
show :: GeneratedKind -> String
$cshowList :: [GeneratedKind] -> ShowS
showList :: [GeneratedKind] -> ShowS
Show, GeneratedKind -> GeneratedKind -> Bool
(GeneratedKind -> GeneratedKind -> Bool)
-> (GeneratedKind -> GeneratedKind -> Bool) -> Eq GeneratedKind
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: GeneratedKind -> GeneratedKind -> Bool
== :: GeneratedKind -> GeneratedKind -> Bool
$c/= :: GeneratedKind -> GeneratedKind -> Bool
/= :: GeneratedKind -> GeneratedKind -> Bool
Eq)

instance PP.Pretty GeneratedKind where
  pretty :: forall ann. GeneratedKind -> Doc ann
pretty = \case
    GeneratedKind
RecursiveLet -> Doc ann
"recursive let"

-- | Set the provenance on a term to the given value.
setProvenance :: Functor f => Provenance b -> f a -> f (Provenance b)
setProvenance :: forall (f :: * -> *) b a.
Functor f =>
Provenance b -> f a -> f (Provenance b)
setProvenance = Provenance b -> f a -> f (Provenance b)
forall a b. a -> f b -> f a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
(<$)

-- | Mark all the annotations on a term as original. Useful for preparing terms for the PIR compiler.
original :: Functor f => f a -> f (Provenance a)
original :: forall (f :: * -> *) a. Functor f => f a -> f (Provenance a)
original = (a -> Provenance a) -> f a -> f (Provenance a)
forall a b. (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> Provenance a
forall a. a -> Provenance a
Original

instance PP.Pretty a => PP.Pretty (Provenance a) where
  pretty :: forall ann. Provenance a -> Doc ann
pretty = \case
    DatatypeComponent DatatypeComponent
c Provenance a
p -> DatatypeComponent -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. DatatypeComponent -> Doc ann
PP.pretty DatatypeComponent
c Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
";" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"from" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Provenance a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Provenance a -> Doc ann
PLC.pretty Provenance a
p
    Original a
p -> a -> Doc ann
forall ann. a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
PLC.pretty a
p
    LetBinding Recursivity
r Provenance a
p ->
      let
        rstr :: Doc ann
rstr = case Recursivity
r of
          Recursivity
NonRec -> Doc ann
"non-recursive"
          Recursivity
Rec -> Doc ann
"recursive"
       in
        Doc ann
"(" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
rstr Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
")" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"let binding" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
";" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"from" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Provenance a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Provenance a -> Doc ann
PLC.pretty Provenance a
p
    TermBinding String
n Provenance a
p -> Doc ann
"term binding" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"of" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
PLC.pretty String
n Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
";" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"from" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Provenance a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Provenance a -> Doc ann
PLC.pretty Provenance a
p
    TypeBinding String
n Provenance a
p -> Doc ann
"type binding" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"of" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
PLC.pretty String
n Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
";" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"from" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Provenance a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Provenance a -> Doc ann
PLC.pretty Provenance a
p
    MultipleSources Set (Provenance a)
p1 -> case Set (Provenance a) -> [Provenance a]
forall a. Set a -> [a]
S.toList Set (Provenance a)
p1 of
      [] -> Doc ann
"<unknown>"
      [Provenance a]
l -> [Provenance a] -> Doc ann
forall ann. [Provenance a] -> Doc ann
forall a ann. Pretty a => [a] -> Doc ann
PLC.prettyList [Provenance a]
l