A data type similar to Data.Validation that recovers from errors.
data Recover e v = Success v | Recover e v | Failure eA Recover e v contains a value v or an error e or both. This is
similar to Data.These, but with a different Applicative instance.
instance Semigroup e => Applicative (Recover e) where
pure = Success
Success f <*> Success v = Success (f v)
Success f <*> Recover e v = Recover e (f v)
Success _ <*> Failure e = Failure e
Recover e f <*> Success v = Recover e (f v)
Recover e f <*> Recover ee v = Recover (e <> ee) (f v)
Recover e _ <*> Failure ee = Failure (e <> ee)
Failure e <*> Success _ = Failure e
Failure e <*> Recover ee _ = Failure (e <> ee)
Failure e <*> Failure ee = Failure (e <> ee)Like Data.Validation, the Applicative instance of Recover allows the
validation of various values while accumulating all the errors.
Foo <$> (Success a) <*> (Success b) == Success (Foo a b)
Foo <$> (Failure e) <*> (Failure ee) == Failure (e <> ee)
Foo <$> (Success a) <*> (Failure ee) == Failure eUnlike Data.Validation, Recover also has a constructor that represents
the situation in which there were errors but a value could, nonetheless, be
obtained. All errors are still accumulated.
Foo <$> (Recover e a) <*> (Success b) = Recover e (Foo a b)
Foo <$> (Recover e a) <*> (Recover ee b) = Recover (e <> ee) (Foo a b)