{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE ScopedTypeVariables #-}

module Test.Validity.Types
    ( CanFail(..)
    ) where

-- | A class of types that are the result of functions that can fail
class CanFail f where
    hasFailed :: f a -> Bool
    resultIfSucceeded :: f a -> Maybe a

instance CanFail Maybe where
    hasFailed :: Maybe a -> Bool
hasFailed Nothing = Bool
True
    hasFailed _ = Bool
False
    resultIfSucceeded :: Maybe a -> Maybe a
resultIfSucceeded Nothing = Maybe a
forall a. Maybe a
Nothing
    resultIfSucceeded (Just r :: a
r) = a -> Maybe a
forall a. a -> Maybe a
Just a
r

instance CanFail (Either e) where
    hasFailed :: Either e a -> Bool
hasFailed (Left _) = Bool
True
    hasFailed _ = Bool
False
    resultIfSucceeded :: Either e a -> Maybe a
resultIfSucceeded (Left _) = Maybe a
forall a. Maybe a
Nothing
    resultIfSucceeded (Right r :: a
r) = a -> Maybe a
forall a. a -> Maybe a
Just a
r