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

module Test.Syd.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 Maybe a
Nothing = Bool
True
    hasFailed Maybe a
_ = Bool
False
    resultIfSucceeded :: Maybe a -> Maybe a
resultIfSucceeded Maybe a
Nothing = Maybe a
forall a. Maybe a
Nothing
    resultIfSucceeded (Just 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 e
_) = Bool
True
    hasFailed Either e a
_ = Bool
False
    resultIfSucceeded :: Either e a -> Maybe a
resultIfSucceeded (Left e
_) = Maybe a
forall a. Maybe a
Nothing
    resultIfSucceeded (Right a
r) = a -> Maybe a
forall a. a -> Maybe a
Just a
r