these-1.1.1.1: An either-or-both data type.
Safe Haskell Safe
Language Haskell2010

Data.These

Description

The These type and associated operations. Now enhanced with Control.Lens magic!

Synopsis

Documentation

data These a b Source #

The These type represents values with two non-exclusive possibilities.

This can be useful to represent combinations of two values, where the combination is defined if either input is. Algebraically, the type These A B represents (A + B + AB) , which doesn't factor easily into sums and products--a type like Either A (B, Maybe A) is unclear and awkward to use.

These has straightforward instances of Functor , Monad , &c., and behaves like a hybrid error/writer monad, as would be expected.

For zipping and unzipping of structures with These values, see Data.Align .

Constructors

This a
That b
These a b

Instances

Instances details
Bifunctor These Source #
Instance details

Defined in Data.These

Methods

bimap :: (a -> b) -> (c -> d) -> These a c -> These b d Source #

first :: (a -> b) -> These a c -> These b c Source #

second :: (b -> c) -> These a b -> These a c Source #

Swap These Source #

Since: 0.8

Instance details

Defined in Data.These

Assoc These Source #

Since: 0.8

Instance details

Defined in Data.These

Bitraversable These Source #
Instance details

Defined in Data.These

Methods

bitraverse :: Applicative f => (a -> f c) -> (b -> f d) -> These a b -> f ( These c d) Source #

Bifoldable These Source #
Instance details

Defined in Data.These

Methods

bifold :: Monoid m => These m m -> m Source #

bifoldMap :: Monoid m => (a -> m) -> (b -> m) -> These a b -> m Source #

bifoldr :: (a -> c -> c) -> (b -> c -> c) -> c -> These a b -> c Source #

bifoldl :: (c -> a -> c) -> (c -> b -> c) -> c -> These a b -> c Source #

Eq2 These Source #

Since: 1.1.1

Instance details

Defined in Data.These

Methods

liftEq2 :: (a -> b -> Bool ) -> (c -> d -> Bool ) -> These a c -> These b d -> Bool Source #

Ord2 These Source #

Since: 1.1.1

Instance details

Defined in Data.These

Methods

liftCompare2 :: (a -> b -> Ordering ) -> (c -> d -> Ordering ) -> These a c -> These b d -> Ordering Source #

Read2 These Source #

Since: 1.1.1

Instance details

Defined in Data.These

Show2 These Source #

Since: 1.1.1

Instance details

Defined in Data.These

Methods

liftShowsPrec2 :: ( Int -> a -> ShowS ) -> ([a] -> ShowS ) -> ( Int -> b -> ShowS ) -> ([b] -> ShowS ) -> Int -> These a b -> ShowS Source #

liftShowList2 :: ( Int -> a -> ShowS ) -> ([a] -> ShowS ) -> ( Int -> b -> ShowS ) -> ([b] -> ShowS ) -> [ These a b] -> ShowS Source #

NFData2 These Source #

Since: 1.1.1

Instance details

Defined in Data.These

Methods

liftRnf2 :: (a -> ()) -> (b -> ()) -> These a b -> () Source #

Hashable2 These Source #

Since: 1.1.1

Instance details

Defined in Data.These

Semigroup a => Monad ( These a) Source #
Instance details

Defined in Data.These

Functor ( These a) Source #
Instance details

Defined in Data.These

Methods

fmap :: (a0 -> b) -> These a a0 -> These a b Source #

(<$) :: a0 -> These a b -> These a a0 Source #

Semigroup a => Applicative ( These a) Source #
Instance details

Defined in Data.These

Foldable ( These a) Source #
Instance details

Defined in Data.These

Methods

fold :: Monoid m => These a m -> m Source #

foldMap :: Monoid m => (a0 -> m) -> These a a0 -> m Source #

foldMap' :: Monoid m => (a0 -> m) -> These a a0 -> m Source #

foldr :: (a0 -> b -> b) -> b -> These a a0 -> b Source #

foldr' :: (a0 -> b -> b) -> b -> These a a0 -> b Source #

foldl :: (b -> a0 -> b) -> b -> These a a0 -> b Source #

foldl' :: (b -> a0 -> b) -> b -> These a a0 -> b Source #

foldr1 :: (a0 -> a0 -> a0) -> These a a0 -> a0 Source #

foldl1 :: (a0 -> a0 -> a0) -> These a a0 -> a0 Source #

toList :: These a a0 -> [a0] Source #

null :: These a a0 -> Bool Source #

length :: These a a0 -> Int Source #

elem :: Eq a0 => a0 -> These a a0 -> Bool Source #

maximum :: Ord a0 => These a a0 -> a0 Source #

minimum :: Ord a0 => These a a0 -> a0 Source #

sum :: Num a0 => These a a0 -> a0 Source #

product :: Num a0 => These a a0 -> a0 Source #

Traversable ( These a) Source #
Instance details

Defined in Data.These

Methods

traverse :: Applicative f => (a0 -> f b) -> These a a0 -> f ( These a b) Source #

sequenceA :: Applicative f => These a (f a0) -> f ( These a a0) Source #

mapM :: Monad m => (a0 -> m b) -> These a a0 -> m ( These a b) Source #

sequence :: Monad m => These a (m a0) -> m ( These a a0) Source #

Eq a => Eq1 ( These a) Source #

Since: 1.1.1

Instance details

Defined in Data.These

Methods

liftEq :: (a0 -> b -> Bool ) -> These a a0 -> These a b -> Bool Source #

Ord a => Ord1 ( These a) Source #

Since: 1.1.1

Instance details

Defined in Data.These

Read a => Read1 ( These a) Source #

Since: 1.1.1

Instance details

Defined in Data.These

Show a => Show1 ( These a) Source #

Since: 1.1.1

Instance details

Defined in Data.These

NFData a => NFData1 ( These a) Source #

Since: 1.1.1

Instance details

Defined in Data.These

Methods

liftRnf :: (a0 -> ()) -> These a a0 -> () Source #

Hashable a => Hashable1 ( These a) Source #

Since: 1.1.1

Instance details

Defined in Data.These

Generic1 ( These a :: Type -> Type ) Source #
Instance details

Defined in Data.These

Associated Types

type Rep1 ( These a) :: k -> Type Source #

Methods

from1 :: forall (a0 :: k). These a a0 -> Rep1 ( These a) a0 Source #

to1 :: forall (a0 :: k). Rep1 ( These a) a0 -> These a a0 Source #

( Eq a, Eq b) => Eq ( These a b) Source #
Instance details

Defined in Data.These

( Data a, Data b) => Data ( These a b) Source #
Instance details

Defined in Data.These

Methods

gfoldl :: ( forall d b0. Data d => c (d -> b0) -> d -> c b0) -> ( forall g. g -> c g) -> These a b -> c ( These a b) Source #

gunfold :: ( forall b0 r. Data b0 => c (b0 -> r) -> c r) -> ( forall r. r -> c r) -> Constr -> c ( These a b) Source #

toConstr :: These a b -> Constr Source #

dataTypeOf :: These a b -> DataType Source #

dataCast1 :: Typeable t => ( forall d. Data d => c (t d)) -> Maybe (c ( These a b)) Source #

dataCast2 :: Typeable t => ( forall d e. ( Data d, Data e) => c (t d e)) -> Maybe (c ( These a b)) Source #

gmapT :: ( forall b0. Data b0 => b0 -> b0) -> These a b -> These a b Source #

gmapQl :: (r -> r' -> r) -> r -> ( forall d. Data d => d -> r') -> These a b -> r Source #

gmapQr :: forall r r'. (r' -> r -> r) -> r -> ( forall d. Data d => d -> r') -> These a b -> r Source #

gmapQ :: ( forall d. Data d => d -> u) -> These a b -> [u] Source #

gmapQi :: Int -> ( forall d. Data d => d -> u) -> These a b -> u Source #

gmapM :: Monad m => ( forall d. Data d => d -> m d) -> These a b -> m ( These a b) Source #

gmapMp :: MonadPlus m => ( forall d. Data d => d -> m d) -> These a b -> m ( These a b) Source #

gmapMo :: MonadPlus m => ( forall d. Data d => d -> m d) -> These a b -> m ( These a b) Source #

( Ord a, Ord b) => Ord ( These a b) Source #
Instance details

Defined in Data.These

( Read a, Read b) => Read ( These a b) Source #
Instance details

Defined in Data.These

( Show a, Show b) => Show ( These a b) Source #
Instance details

Defined in Data.These

Generic ( These a b) Source #
Instance details

Defined in Data.These

Associated Types

type Rep ( These a b) :: Type -> Type Source #

( Semigroup a, Semigroup b) => Semigroup ( These a b) Source #
Instance details

Defined in Data.These

( Binary a, Binary b) => Binary ( These a b) Source #

Since: 0.7.1

Instance details

Defined in Data.These

( NFData a, NFData b) => NFData ( These a b) Source #

Since: 0.7.1

Instance details

Defined in Data.These

Methods

rnf :: These a b -> () Source #

( Hashable a, Hashable b) => Hashable ( These a b) Source #
Instance details

Defined in Data.These

type Rep1 ( These a :: Type -> Type ) Source #
Instance details

Defined in Data.These

type Rep ( These a b) Source #
Instance details

Defined in Data.These

Functions to get rid of These

these :: (a -> c) -> (b -> c) -> (a -> b -> c) -> These a b -> c Source #

Case analysis for the These type.

fromThese :: a -> b -> These a b -> (a, b) Source #

Takes two default values and produces a tuple.

mergeThese :: (a -> a -> a) -> These a a -> a Source #

Coalesce with the provided operation.

mergeTheseWith :: (a -> c) -> (b -> c) -> (c -> c -> c) -> These a b -> c Source #

bimap and coalesce results with the provided operation.

Partition

partitionThese :: [ These a b] -> ([a], [b], [(a, b)]) Source #

Select each constructor and partition them into separate lists.

partitionHereThere :: [ These a b] -> ([a], [b]) Source #

Select here and there elements and partition them into separate lists.

Since: 0.8

partitionEithersNE :: NonEmpty ( Either a b) -> These ( NonEmpty a) ( NonEmpty b) Source #

Like partitionEithers but for NonEmpty types.

Note: this is not online algorithm. In the worst case it will traverse the whole list before deciding the result constructor.

>>> partitionEithersNE $ Left 'x' :| [Right 'y']
These ('x' :| "") ('y' :| "")
>>> partitionEithersNE $ Left 'x' :| map Left "yz"
This ('x' :| "yz")

Since: 1.0.1

Distributivity

This distributivity combinators aren't isomorphisms!