module U.Codebase.TermEdit where

import U.Codebase.Referent (Referent)

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

-- Replacements with the Same type can be automatically propagated.
-- Replacements with a Subtype can be automatically propagated but may result in dependents getting more general types, so requires re-inference.
-- Replacements of a Different type need to be manually propagated by the programmer.
data Typing = Same | Subtype | Different
  deriving (Typing -> Typing -> Bool
(Typing -> Typing -> Bool)
-> (Typing -> Typing -> Bool) -> Eq Typing
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Typing -> Typing -> Bool
== :: Typing -> Typing -> Bool
$c/= :: Typing -> Typing -> Bool
/= :: Typing -> Typing -> Bool
Eq, Eq Typing
Eq Typing =>
(Typing -> Typing -> Ordering)
-> (Typing -> Typing -> Bool)
-> (Typing -> Typing -> Bool)
-> (Typing -> Typing -> Bool)
-> (Typing -> Typing -> Bool)
-> (Typing -> Typing -> Typing)
-> (Typing -> Typing -> Typing)
-> Ord Typing
Typing -> Typing -> Bool
Typing -> Typing -> Ordering
Typing -> Typing -> Typing
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 :: Typing -> Typing -> Ordering
compare :: Typing -> Typing -> Ordering
$c< :: Typing -> Typing -> Bool
< :: Typing -> Typing -> Bool
$c<= :: Typing -> Typing -> Bool
<= :: Typing -> Typing -> Bool
$c> :: Typing -> Typing -> Bool
> :: Typing -> Typing -> Bool
$c>= :: Typing -> Typing -> Bool
>= :: Typing -> Typing -> Bool
$cmax :: Typing -> Typing -> Typing
max :: Typing -> Typing -> Typing
$cmin :: Typing -> Typing -> Typing
min :: Typing -> Typing -> Typing
Ord, Int -> Typing -> ShowS
[Typing] -> ShowS
Typing -> String
(Int -> Typing -> ShowS)
-> (Typing -> String) -> ([Typing] -> ShowS) -> Show Typing
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Typing -> ShowS
showsPrec :: Int -> Typing -> ShowS
$cshow :: Typing -> String
show :: Typing -> String
$cshowList :: [Typing] -> ShowS
showList :: [Typing] -> ShowS
Show)