(original) (raw)

{-# LANGUAGE CPP #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE NoImplicitPrelude #-} {-# LANGUAGE PolyKinds #-} {-# LANGUAGE Trustworthy #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE UndecidableInstances #-}

module Data.Either ( Either(..), either, lefts, rights, isLeft, isRight, fromLeft, fromRight, partitionEithers, ) where

import GHC.Base import GHC.Show import GHC.Read

data Either a b = Left a | Right b deriving ( Either a b -> Either a b -> Bool (Either a b -> Either a b -> Bool) -> (Either a b -> Either a b -> Bool) -> Eq (Either a b) forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a forall a b. (Eq a, Eq b) => Either a b -> Either a b -> Bool /= :: Either a b -> Either a b -> Bool $c/= :: forall a b. (Eq a, Eq b) => Either a b -> Either a b -> Bool == :: Either a b -> Either a b -> Bool $c== :: forall a b. (Eq a, Eq b) => Either a b -> Either a b -> Bool Eq
, Eq (Either a b) Eq (Either a b) -> (Either a b -> Either a b -> Ordering) -> (Either a b -> Either a b -> Bool) -> (Either a b -> Either a b -> Bool) -> (Either a b -> Either a b -> Bool) -> (Either a b -> Either a b -> Bool) -> (Either a b -> Either a b -> Either a b) -> (Either a b -> Either a b -> Either a b) -> Ord (Either a b) Either a b -> Either a b -> Bool Either a b -> Either a b -> Ordering Either a b -> Either a b -> Either a b forall a. Eq a -> (a -> a -> Ordering) -> (a -> a -> Bool) -> (a -> a -> Bool) -> (a -> a -> Bool) -> (a -> a -> Bool) -> (a -> a -> a) -> (a -> a -> a) -> Ord a forall {a} {b}. (Ord a, Ord b) => Eq (Either a b) forall a b. (Ord a, Ord b) => Either a b -> Either a b -> Bool forall a b. (Ord a, Ord b) => Either a b -> Either a b -> Ordering forall a b. (Ord a, Ord b) => Either a b -> Either a b -> Either a b min :: Either a b -> Either a b -> Either a b $cmin :: forall a b. (Ord a, Ord b) => Either a b -> Either a b -> Either a b max :: Either a b -> Either a b -> Either a b $cmax :: forall a b. (Ord a, Ord b) => Either a b -> Either a b -> Either a b

= :: Either a b -> Either a b -> Bool $c>= :: forall a b. (Ord a, Ord b) => Either a b -> Either a b -> Bool :: Either a b -> Either a b -> Bool $c> :: forall a b. (Ord a, Ord b) => Either a b -> Either a b -> Bool <= :: Either a b -> Either a b -> Bool $c<= :: forall a b. (Ord a, Ord b) => Either a b -> Either a b -> Bool < :: Either a b -> Either a b -> Bool $c< :: forall a b. (Ord a, Ord b) => Either a b -> Either a b -> Bool compare :: Either a b -> Either a b -> Ordering $ccompare :: forall a b. (Ord a, Ord b) => Either a b -> Either a b -> Ordering Ord
, ReadPrec [Either a b] ReadPrec (Either a b) Int -> ReadS (Either a b) ReadS [Either a b] (Int -> ReadS (Either a b)) -> ReadS [Either a b] -> ReadPrec (Either a b) -> ReadPrec [Either a b] -> Read (Either a b) forall a. (Int -> ReadS a) -> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a forall a b. (Read a, Read b) => ReadPrec [Either a b] forall a b. (Read a, Read b) => ReadPrec (Either a b) forall a b. (Read a, Read b) => Int -> ReadS (Either a b) forall a b. (Read a, Read b) => ReadS [Either a b] readListPrec :: ReadPrec [Either a b] $creadListPrec :: forall a b. (Read a, Read b) => ReadPrec [Either a b] readPrec :: ReadPrec (Either a b) $creadPrec :: forall a b. (Read a, Read b) => ReadPrec (Either a b) readList :: ReadS [Either a b] $creadList :: forall a b. (Read a, Read b) => ReadS [Either a b] readsPrec :: Int -> ReadS (Either a b) $creadsPrec :: forall a b. (Read a, Read b) => Int -> ReadS (Either a b) Read , Int -> Either a b -> ShowS [Either a b] -> ShowS Either a b -> String (Int -> Either a b -> ShowS) -> (Either a b -> String) -> ([Either a b] -> ShowS) -> Show (Either a b) forall a. (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a forall a b. (Show a, Show b) => Int -> Either a b -> ShowS forall a b. (Show a, Show b) => [Either a b] -> ShowS forall a b. (Show a, Show b) => Either a b -> String showList :: [Either a b] -> ShowS $cshowList :: forall a b. (Show a, Show b) => [Either a b] -> ShowS show :: Either a b -> String $cshow :: forall a b. (Show a, Show b) => Either a b -> String showsPrec :: Int -> Either a b -> ShowS $cshowsPrec :: forall a b. (Show a, Show b) => Int -> Either a b -> ShowS Show )

instance Functor (Either a) where fmap :: forall a b. (a -> b) -> Either a a -> Either a b fmap a -> b _ (Left a x) = a -> Either a b forall a b. a -> Either a b Left a x fmap a -> b f (Right a y) = b -> Either a b forall a b. b -> Either a b Right (a -> b f a y)

instance Semigroup (Either a b) where Left a _ <> :: Either a b -> Either a b -> Either a b <> Either a b b = Either a b b Either a b a <> Either a b _ = Either a b a #if !defined(HADDOCK_VERSION)

stimes n x
  | n <= 0 = errorWithoutStackTrace "stimes: positive multiplier expected"
  | otherwise = x

#endif

instance Applicative (Either e) where pure :: forall a. a -> Either e a pure = a -> Either e a forall a b. b -> Either a b Right Left e e <*> :: forall a b. Either e (a -> b) -> Either e a -> Either e b <*> Either e a _ = e -> Either e b forall a b. a -> Either a b Left e e Right a -> b f <*> Either e a r = (a -> b) -> Either e a -> Either e b forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap a -> b f Either e a r

instance Monad (Either e) where Left e l >>= :: forall a b. Either e a -> (a -> Either e b) -> Either e b >>= a -> Either e b _ = e -> Either e b forall a b. a -> Either a b Left e l Right a r >>= a -> Either e b k = a -> Either e b k a r

either :: (a -> c) -> (b -> c) -> Either a b -> c either :: forall a c b. (a -> c) -> (b -> c) -> Either a b -> c either a -> c f b -> c _ (Left a x) = a -> c f a x either a -> c _ b -> c g (Right b y) = b -> c g b y

lefts :: [Either a b] -> [a] lefts :: forall a b. [Either a b] -> [a] lefts [Either a b] x = [a a | Left a a <- [Either a b] x] {-# INLINEABLE lefts #-}

rights :: [Either a b] -> [b] rights :: forall a b. [Either a b] -> [b] rights [Either a b] x = [b a | Right b a <- [Either a b] x] {-# INLINEABLE rights #-}

partitionEithers :: [Either a b] -> ([a],[b]) partitionEithers :: forall a b. [Either a b] -> ([a], [b]) partitionEithers = (Either a b -> ([a], [b]) -> ([a], [b])) -> ([a], [b]) -> [Either a b] -> ([a], [b]) forall a b. (a -> b -> b) -> b -> [a] -> b foldr ((a -> ([a], [b]) -> ([a], [b])) -> (b -> ([a], [b]) -> ([a], [b])) -> Either a b -> ([a], [b]) -> ([a], [b]) forall a c b. (a -> c) -> (b -> c) -> Either a b -> c either a -> ([a], [b]) -> ([a], [b]) forall {a} {b}. a -> ([a], b) -> ([a], b) left b -> ([a], [b]) -> ([a], [b]) forall {a} {a}. a -> (a, [a]) -> (a, [a]) right) ([],[]) where left :: a -> ([a], b) -> ([a], b) left a a ~([a] l, b r) = (a aa -> [a] -> [a] forall a. a -> [a] -> [a] :[a] l, b r) right :: a -> (a, [a]) -> (a, [a]) right a a ~(a l, [a] r) = (a l, a aa -> [a] -> [a] forall a. a -> [a] -> [a] :[a] r)

isLeft :: Either a b -> Bool isLeft :: forall a b. Either a b -> Bool isLeft (Left a _) = Bool True isLeft (Right b _) = Bool False

isRight :: Either a b -> Bool isRight :: forall a b. Either a b -> Bool isRight (Left a _) = Bool False isRight (Right b _) = Bool True

fromLeft :: a -> Either a b -> a fromLeft :: forall a b. a -> Either a b -> a fromLeft a _ (Left a a) = a a fromLeft a a Either a b _ = a a

fromRight :: b -> Either a b -> b fromRight :: forall b a. b -> Either a b -> b fromRight b _ (Right b b) = b b fromRight b b Either a b _ = b b