relude-1.2.2.0: Safe, performant, user-friendly and lightweight Haskell Standard Library

Copyright | (c) 2018-2023 Kowainik
License | MIT
Maintainer | Kowainik <xrom.xkov@gmail.com>
Stability | Stable
Portability | Portable
Safe Haskell | Safe
Language | Haskell2010

Relude.Extra.Bifunctor

Description

Useful combinators for bifunctors inside functors. This set of functions is useful when you want to work with types like these ones:

    foo :: IO (Either a b)
    bar :: IO (a, b)

    baz :: Maybe (Either a b)
    qux :: Maybe (a, b)

    doo :: (a, a)
    dee :: Either a a

Since: 0.1.0

Synopsis

- bimapBoth :: Bifunctor f => (a -> b) -> f a a -> f b b
- bimapF :: (Functor f, Bifunctor p) => (a -> c) -> (b -> d) -> f (p a b) -> f (p c d)
- firstF :: (Functor f, Bifunctor p) => (a -> c) -> f (p a b) -> f (p c b)
- secondF :: (Functor f, Bifunctor p) => (b -> d) -> f (p a b) -> f (p a d)

# Documentation

bimapBoth :: Bifunctor f => (a -> b) -> f a a -> f b b #

Maps a function over both elements of a bifunctor.

    >>> bimapBoth length ([True], [False, True])
    (1,2)
    >>> map (bimapBoth not) [Left True, Right False]
    [Left False,Right True]

Since: 0.6.0.0

bimapF :: (Functor f, Bifunctor p) => (a -> c) -> (b -> d) -> f (p a b) -> f (p c d) #

Fmaps functions for nested bifunctor. Short for `fmap (bimap f g)`.

    >>> bimapF not length $ Just (False, ['a', 'b'])
    Just (True,2)

Since: 0.1.0

firstF :: (Functor f, Bifunctor p) => (a -> c) -> f (p a b) -> f (p c b) #

Short for `fmap . first`.

    >>> firstF not $ Just (False, ['a', 'b'])
    Just (True,"ab")

Since: 0.1.0

secondF :: (Functor f, Bifunctor p) => (b -> d) -> f (p a b) -> f (p a d) #

Short for `fmap . second`.

    >>> secondF length  $ Just (False, ['a', 'b'])
    Just (False,2)

Since: 0.1.0