-- | Legal verdicts and their algebra.
--
-- 'Verdict' forms a bounded semilattice under 'verdictMeet'
-- with 'Valid' as identity and 'Void' as absorbing element.
-- The ordering @Void > Pending > Voidable > Valid@ reflects
-- legal severity.
module Deontic.Core.Verdict
  ( Verdict(..)
  , verdictMeet
  ) where

-- | The four possible verdicts for a legal act.
data Verdict
  = Valid     -- ^ 유효 — the act is fully effective
  | Void      -- ^ 무효 — the act has no legal effect
  | Voidable  -- ^ 취소가능 — the act is effective but may be rescinded
  | Pending   -- ^ 효력미정 — effectiveness depends on a future event
  deriving (Verdict -> Verdict -> Bool
(Verdict -> Verdict -> Bool)
-> (Verdict -> Verdict -> Bool) -> Eq Verdict
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Verdict -> Verdict -> Bool
== :: Verdict -> Verdict -> Bool
$c/= :: Verdict -> Verdict -> Bool
/= :: Verdict -> Verdict -> Bool
Eq, Eq Verdict
Eq Verdict =>
(Verdict -> Verdict -> Ordering)
-> (Verdict -> Verdict -> Bool)
-> (Verdict -> Verdict -> Bool)
-> (Verdict -> Verdict -> Bool)
-> (Verdict -> Verdict -> Bool)
-> (Verdict -> Verdict -> Verdict)
-> (Verdict -> Verdict -> Verdict)
-> Ord Verdict
Verdict -> Verdict -> Bool
Verdict -> Verdict -> Ordering
Verdict -> Verdict -> Verdict
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 :: Verdict -> Verdict -> Ordering
compare :: Verdict -> Verdict -> Ordering
$c< :: Verdict -> Verdict -> Bool
< :: Verdict -> Verdict -> Bool
$c<= :: Verdict -> Verdict -> Bool
<= :: Verdict -> Verdict -> Bool
$c> :: Verdict -> Verdict -> Bool
> :: Verdict -> Verdict -> Bool
$c>= :: Verdict -> Verdict -> Bool
>= :: Verdict -> Verdict -> Bool
$cmax :: Verdict -> Verdict -> Verdict
max :: Verdict -> Verdict -> Verdict
$cmin :: Verdict -> Verdict -> Verdict
min :: Verdict -> Verdict -> Verdict
Ord, Int -> Verdict -> ShowS
[Verdict] -> ShowS
Verdict -> String
(Int -> Verdict -> ShowS)
-> (Verdict -> String) -> ([Verdict] -> ShowS) -> Show Verdict
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Verdict -> ShowS
showsPrec :: Int -> Verdict -> ShowS
$cshow :: Verdict -> String
show :: Verdict -> String
$cshowList :: [Verdict] -> ShowS
showList :: [Verdict] -> ShowS
Show)

-- | Combine independent verdicts: Void > Pending > Voidable > Valid
verdictMeet :: Verdict -> Verdict -> Verdict
verdictMeet :: Verdict -> Verdict -> Verdict
verdictMeet Verdict
Void Verdict
_ = Verdict
Void
verdictMeet Verdict
_ Verdict
Void = Verdict
Void
verdictMeet Verdict
Pending Verdict
_ = Verdict
Pending
verdictMeet Verdict
_ Verdict
Pending = Verdict
Pending
verdictMeet Verdict
Voidable Verdict
_ = Verdict
Voidable
verdictMeet Verdict
_ Verdict
Voidable = Verdict
Voidable
verdictMeet Verdict
Valid Verdict
Valid = Verdict
Valid