module Deontic.Civil.DefaultObligation () where
import Deontic.Core.Types
import Deontic.Core.Verdict
import Deontic.Core.Adjudicate
import Deontic.Core.Layer (Base, Resolvable)
import Deontic.Civil.Types
type instance Resolvable DefaultAct = '[CreditorDefense, Base]
instance Adjudicate DefaultAct '[Base] where
adjudicate :: DefaultAct -> Facts DefaultAct -> Judgment '[Base]
adjudicate DefaultAct
_ Facts DefaultAct
facts
| Bool -> Bool
not (DefaultFacts -> Bool
dfPerformanceDue Facts DefaultAct
DefaultFacts
facts) =
Verdict -> ArticleRef -> Text -> Judgment '[Base]
forall l. Verdict -> ArticleRef -> Text -> Judgment '[l]
JBase Verdict
Valid
(Text -> Int -> Maybe Int -> ArticleRef
ArticleRef Text
"민법" Int
387 (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
1))
Text
"이행기가 도래하지 아니하여 채무불이행이 아니다."
| Bool -> Bool
not (DefaultFacts -> Bool
dfNonPerformance Facts DefaultAct
DefaultFacts
facts) =
Verdict -> ArticleRef -> Text -> Judgment '[Base]
forall l. Verdict -> ArticleRef -> Text -> Judgment '[l]
JBase Verdict
Valid
(Text -> Int -> Maybe Int -> ArticleRef
ArticleRef Text
"민법" Int
387 (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
1))
Text
"채무를 이행하였으므로 채무불이행이 아니다."
| Bool -> Bool
not (DefaultFacts -> Bool
dfDebtorFault Facts DefaultAct
DefaultFacts
facts) =
Verdict -> ArticleRef -> Text -> Judgment '[Base]
forall l. Verdict -> ArticleRef -> Text -> Judgment '[l]
JBase Verdict
Valid
(Text -> Int -> Maybe Int -> ArticleRef
ArticleRef Text
"민법" Int
390 Maybe Int
forall a. Maybe a
Nothing)
Text
"채무자의 고의나 과실 없는 사유로 이행하지 아니한 때에는 손해배상의 책임이 없다."
| DefaultFacts -> Bool
dfImpossible Facts DefaultAct
DefaultFacts
facts =
Verdict -> ArticleRef -> Text -> Judgment '[Base]
forall l. Verdict -> ArticleRef -> Text -> Judgment '[l]
JBase Verdict
Void
(Text -> Int -> Maybe Int -> ArticleRef
ArticleRef Text
"민법" Int
390 Maybe Int
forall a. Maybe a
Nothing)
Text
"채무자의 귀책사유로 이행이 불능하게 되어 전보배상의 책임이 있다."
| Bool
otherwise =
Verdict -> ArticleRef -> Text -> Judgment '[Base]
forall l. Verdict -> ArticleRef -> Text -> Judgment '[l]
JBase Verdict
Void
(Text -> Int -> Maybe Int -> ArticleRef
ArticleRef Text
"민법" Int
387 (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
1))
Text
"이행기가 도래하였으나 이행하지 아니하여 이행지체의 책임이 있다."
instance Adjudicate DefaultAct rest
=> Adjudicate DefaultAct (CreditorDefense ': rest) where
adjudicate :: DefaultAct -> Facts DefaultAct -> Judgment (CreditorDefense : rest)
adjudicate DefaultAct
act Facts DefaultAct
facts
| DefaultFacts -> Bool
dfCreditorFault Facts DefaultAct
DefaultFacts
facts
, let prev :: Judgment rest
prev = forall act (layers :: [*]).
Adjudicate act layers =>
act -> Facts act -> Judgment layers
adjudicate @_ @rest DefaultAct
act Facts DefaultAct
facts
, Judgment rest -> Verdict
forall (layers :: [*]). Judgment layers -> Verdict
verdict Judgment rest
prev Verdict -> Verdict -> Bool
forall a. Eq a => a -> a -> Bool
== Verdict
Void =
Judgment rest
-> Verdict
-> ArticleRef
-> Text
-> Judgment (CreditorDefense : rest)
forall (prev :: [*]) l.
Judgment prev
-> Verdict -> ArticleRef -> Text -> Judgment (l : prev)
JOverride Judgment rest
prev
Verdict
Voidable
(Text -> Int -> Maybe Int -> ArticleRef
ArticleRef Text
"민법" Int
390 Maybe Int
forall a. Maybe a
Nothing)
Text
"채권자에게도 과실이 있으므로 손해배상의 책임이 감경된다."
| Bool
otherwise =
Judgment rest -> Judgment (CreditorDefense : rest)
forall (prev :: [*]) l. Judgment prev -> Judgment (l : prev)
JDelegate (forall act (layers :: [*]).
Adjudicate act layers =>
act -> Facts act -> Judgment layers
adjudicate @_ @rest DefaultAct
act Facts DefaultAct
facts)