extra-0.3.2: src/Data/Either/Extra.hs
{-# LANGUAGE CPP #-}
{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
module Data.Either.Extra(
module Data.Either,
isLeft, isRight, fromLeft, fromRight, fromEither
) where
import Data.Either
-- | The 'fromLeft' function extracts the element out of a 'Left' and
-- throws an error if its argument is 'Right'.
-- Much like 'fromJust', using this function in polished code is usually a bad idea.
--
-- > \x -> fromLeft (Left x) == x
-- > \x -> fromLeft (Right x) == undefined
fromLeft :: Either l r -> l
fromLeft (Left x) = x
-- | The 'fromRight' function extracts the element out of a 'Right' and
-- throws an error if its argument is 'Left'.
-- Much like 'fromJust', using this function in polished code is usually a bad idea.
--
-- > \x -> fromRight (Right x) == x
-- > \x -> fromRight (Left x) == undefined
fromRight :: Either l r -> r
fromRight (Right x) = x
#if __GLASGOW_HASKELL__ < 708
-- | Test if an 'Either' value is the 'Left' constructor.
-- Provided as standard with GHC 7.8 and above.
isLeft :: Either l r -> Bool
isLeft Left{} = True; isLeft _ = False
-- | Test if an 'Either' value is the 'Right' constructor.
-- Provided as standard with GHC 7.8 and above.
isRight :: Either l r -> Bool
isRight Right{} = True; isRight _ = False
#endif
-- | Pull the value out of an 'Either' where both alternatives
-- have the same type.
--
-- > \x -> fromEither (Left x ) == x
-- > \x -> fromEither (Right x) == x
fromEither :: Either a a -> a
fromEither = either id id