-- | Overloaded @if@-expression. module Overloaded.If ( ToBool (..), ifte, ) where import Data.Maybe (isJust) import Data.Either (isRight) -- | Class for 'Bool'-like datastrucutres -- -- An @if-@-expression @if b then t else e@ is desugared to -- -- @ -- ifte ('toBool' b) t e -- @ -- -- Enabled with: -- -- @ -- {-\# OPTIONS -fplugin=Overloaded -fplugin-opt=Overloaded:If #-} -- @ -- class ToBool b where toBool :: b -> Bool instance ToBool Bool where toBool = id -- | 'Just' is 'True' instance ToBool (Maybe a) where toBool = isJust -- | 'Right' is 'True' instance ToBool (Either b a) where toBool = isRight -- | 'ToBool' overloaded @if@-expression. ifte :: ToBool b => b -> a -> a -> a ifte b t e = if toBool b then t else e