From: Ian Lynagh Date: Fri, 14 Mar 2008 19:30:37 +0000 (+0000) Subject: Add partitionEithers, lefts, and rights. X-Git-Tag: 2008-05-28~31 X-Git-Url: http://git.megacz.com/?a=commitdiff_plain;ds=sidebyside;h=b00868d3e62b6f00af6a2d71cf1d35087c832b85;p=ghc-base.git Add partitionEithers, lefts, and rights. Patch from Russell O'Connor, trac proposal #974. --- diff --git a/Data/Either.hs b/Data/Either.hs index 38766ad..f64c3e4 100644 --- a/Data/Either.hs +++ b/Data/Either.hs @@ -15,12 +15,22 @@ module Data.Either ( Either(..), - either -- :: (a -> c) -> (b -> c) -> Either a b -> c + either, -- :: (a -> c) -> (b -> c) -> Either a b -> c + lefts, -- :: [Either a b] -> [a] + rights, -- :: [Either a b] -> [b] + partitionEithers, -- :: [Either a b] -> ([a],[b]) ) where +import Data.Tuple + #ifdef __GLASGOW_HASKELL__ import GHC.Base +{- +-- just for testing +import Test.QuickCheck +-} + {-| The 'Either' type represents values with two possibilities: a value of @@ -40,3 +50,36 @@ either :: (a -> c) -> (b -> c) -> Either a b -> c either f _ (Left x) = f x either _ g (Right y) = g y #endif /* __GLASGOW_HASKELL__ */ + +-- | Extracts from a list of 'Either' all the 'Left' elements +-- All the 'Left' elements are extracted in order. + +lefts :: [Either a b] -> [a] +lefts x = [a | Left a <- x] + +-- | Extracts from a list of 'Either' all the 'Right' elements +-- All the 'Right' elements are extracted in order. + +rights :: [Either a b] -> [b] +rights x = [a | Right a <- x] + +-- | Partitions a list of 'Either' into two lists +-- All the 'Left' elements are extracted, in order, to the first +-- component of the output. Similarly the 'Right' elements are extracted +-- to the second component of the output. + +partitionEithers :: [Either a b] -> ([a],[b]) +partitionEithers = foldr (either left right) ([],[]) + where + left a (l, r) = (a:l, r) + right a (l, r) = (l, a:r) + +{- +{-------------------------------------------------------------------- + Testing +--------------------------------------------------------------------} +prop_partitionEithers :: [Either Int Int] -> Bool +prop_partitionEithers x = + partitionEithers x == (lefts x, rights x) +-} +