semigroupoids-6.0.1: Semigroupoids: Category sans id

Copyright | (C) 2011-2015 Edward Kmett
License | BSD-style (see the file LICENSE)
Maintainer | Edward Kmett <ekmett@gmail.com>
Stability | provisional
Portability | portable
Safe Haskell | Trustworthy
Language | Haskell2010

Data.Functor.Extend

Contents

- Extendable Functors

Description

Synopsis

- class Functor w => Extend (w :: Type -> Type) where
  - duplicated :: w a -> w (w a)
  - extended :: (w a -> b) -> w a -> w b
- gduplicated :: (Extend (Rep1 w), Generic1 w) => w a -> w (w a)
- gextended :: (Extend (Rep1 w), Generic1 w) => (w a -> b) -> w a -> w b

# Extendable Functors

There are two ways to define an `Extend` instance:

I. Provide definitions for `extended` satisfying this law:

    extended f . extended g = extended (f . extended g)

II. Alternately, you may choose to provide definitions for `duplicated` satisfying this law:

    duplicated . duplicated = fmap duplicated . duplicated

You may of course, choose to define both `duplicated` and `extended`. In that case you must also satisfy these laws:

    extended f = fmap f . duplicated
    duplicated = extended id

These are the default definitions of `extended` and `duplicated`.

class Functor w => Extend (w :: Type -> Type) where Source #

Minimal complete definition

duplicated | extended

Methods

duplicated :: w a -> w (w a) Source #

    duplicated = extended id
    fmap (fmap f) . duplicated = duplicated . fmap f

extended :: (w a -> b) -> w a -> w b Source #

    extended f  = fmap f . duplicated

#### Instances

Instances details

Extend First Source # |
Instance details Defined in Data.Functor.Extend Methods duplicated :: First a -> First (First a) Source # extended :: (First a -> b) -> First a -> First b Source #
Extend Last Source # |
Instance details Defined in Data.Functor.Extend Methods duplicated :: Last a -> Last (Last a) Source # extended :: (Last a -> b) -> Last a -> Last b Source #
Extend Max Source # |
Instance details Defined in Data.Functor.Extend Methods duplicated :: Max a -> Max (Max a) Source # extended :: (Max a -> b) -> Max a -> Max b Source #
Extend Min Source # |
Instance details Defined in Data.Functor.Extend Methods duplicated :: Min a -> Min (Min a) Source # extended :: (Min a -> b) -> Min a -> Min b Source #
Extend Seq Source # |
Instance details Defined in Data.Functor.Extend Methods duplicated :: Seq a -> Seq (Seq a) Source # extended :: (Seq a -> b) -> Seq a -> Seq b Source #
Extend Tree Source # |
Instance details Defined in Data.Functor.Extend Methods duplicated :: Tree a -> Tree (Tree a) Source # extended :: (Tree a -> b) -> Tree a -> Tree b Source #
Extend NonEmpty Source # |
Instance details Defined in Data.Functor.Extend Methods duplicated :: NonEmpty a -> NonEmpty (NonEmpty a) Source # extended :: (NonEmpty a -> b) -> NonEmpty a -> NonEmpty b Source #
Extend Identity Source # |
Instance details Defined in Data.Functor.Extend Methods duplicated :: Identity a -> Identity (Identity a) Source # extended :: (Identity a -> b) -> Identity a -> Identity b Source #
Extend Dual Source # |
Instance details Defined in Data.Functor.Extend Methods duplicated :: Dual a -> Dual (Dual a) Source # extended :: (Dual a -> b) -> Dual a -> Dual b Source #
Extend Product Source # |
Instance details Defined in Data.Functor.Extend Methods duplicated :: Product a -> Product (Product a) Source # extended :: (Product a -> b) -> Product a -> Product b Source #
Extend Sum Source # |
Instance details Defined in Data.Functor.Extend Methods duplicated :: Sum a -> Sum (Sum a) Source # extended :: (Sum a -> b) -> Sum a -> Sum b Source #
Extend Par1 Source # |
Instance details Defined in Data.Functor.Extend Methods duplicated :: Par1 a -> Par1 (Par1 a) Source # extended :: (Par1 a -> b) -> Par1 a -> Par1 b Source #
Extend Maybe Source # |
Instance details Defined in Data.Functor.Extend Methods duplicated :: Maybe a -> Maybe (Maybe a) Source # extended :: (Maybe a -> b) -> Maybe a -> Maybe b Source #
Extend [] Source # |
Instance details Defined in Data.Functor.Extend Methods duplicated :: [a] -> [[a]] Source # extended :: ([a] -> b) -> [a] -> [b] Source #
Extend (Either a) Source # |
Instance details Defined in Data.Functor.Extend Methods duplicated :: Either a a0 -> Either a (Either a a0) Source # extended :: (Either a a0 -> b) -> Either a a0 -> Either a b Source #
Extend (Proxy :: Type -> Type) Source # |
Instance details Defined in Data.Functor.Extend Methods duplicated :: Proxy a -> Proxy (Proxy a) Source # extended :: (Proxy a -> b) -> Proxy a -> Proxy b Source #
Extend (U1 :: Type -> Type) Source # |
Instance details Defined in Data.Functor.Extend Methods duplicated :: U1 a -> U1 (U1 a) Source # extended :: (U1 a -> b) -> U1 a -> U1 b Source #
Extend (V1 :: Type -> Type) Source # |
Instance details Defined in Data.Functor.Extend Methods duplicated :: V1 a -> V1 (V1 a) Source # extended :: (V1 a -> b) -> V1 a -> V1 b Source #
Extend f => Extend (MaybeApply f) Source # |
Instance details Defined in Data.Functor.Bind.Class Methods duplicated :: MaybeApply f a -> MaybeApply f (MaybeApply f a) Source # extended :: (MaybeApply f a -> b) -> MaybeApply f a -> MaybeApply f b Source #
Extend ((,) e) Source # |
Instance details Defined in Data.Functor.Extend Methods duplicated :: (e, a) -> (e, (e, a)) Source # extended :: ((e, a) -> b) -> (e, a) -> (e, b) Source #
Extend w => Extend (EnvT e w) Source # |
Instance details Defined in Data.Functor.Extend Methods duplicated :: EnvT e w a -> EnvT e w (EnvT e w a) Source # extended :: (EnvT e w a -> b) -> EnvT e w a -> EnvT e w b Source #
Extend w => Extend (StoreT s w) Source # |
Instance details Defined in Data.Functor.Extend Methods duplicated :: StoreT s w a -> StoreT s w (StoreT s w a) Source # extended :: (StoreT s w a -> b) -> StoreT s w a -> StoreT s w b Source #
(Extend w, Semigroup m) => Extend (TracedT m w) Source # |
Instance details Defined in Data.Functor.Extend Methods duplicated :: TracedT m w a -> TracedT m w (TracedT m w a) Source # extended :: (TracedT m w a -> b) -> TracedT m w a -> TracedT m w b Source #
Extend f => Extend (Alt f) Source # |
Instance details Defined in Data.Functor.Extend Methods duplicated :: Alt f a -> Alt f (Alt f a) Source # extended :: (Alt f a -> b) -> Alt f a -> Alt f b Source #
Extend f => Extend (Rec1 f) Source # |
Instance details Defined in Data.Functor.Extend Methods duplicated :: Rec1 f a -> Rec1 f (Rec1 f a) Source # extended :: (Rec1 f a -> b) -> Rec1 f a -> Rec1 f b Source #
(Extend f, Semigroup a) => Extend (Static f a) Source # |
Instance details Defined in Data.Semigroupoid.Static Methods duplicated :: Static f a a0 -> Static f a (Static f a a0) Source # extended :: (Static f a a0 -> b) -> Static f a a0 -> Static f a b Source #
Extend (Tagged a) Source # |
Instance details Defined in Data.Functor.Extend Methods duplicated :: Tagged a a0 -> Tagged a (Tagged a a0) Source # extended :: (Tagged a a0 -> b) -> Tagged a a0 -> Tagged a b Source #
Extend w => Extend (IdentityT w) Source # |
Instance details Defined in Data.Functor.Extend Methods duplicated :: IdentityT w a -> IdentityT w (IdentityT w a) Source # extended :: (IdentityT w a -> b) -> IdentityT w a -> IdentityT w b Source #
(Extend f, Extend g) => Extend (Sum f g) Source # |
Instance details Defined in Data.Functor.Extend Methods duplicated :: Sum f g a -> Sum f g (Sum f g a) Source # extended :: (Sum f g a -> b) -> Sum f g a -> Sum f g b Source #
(Extend f, Extend g) => Extend (f :+: g) Source # |
Instance details Defined in Data.Functor.Extend Methods duplicated :: (f :+: g) a -> (f :+: g) ((f :+: g) a) Source # extended :: ((f :+: g) a -> b) -> (f :+: g) a -> (f :+: g) b Source #
Extend (K1 i c :: Type -> Type) Source # | Since: 5.3.8
Instance details Defined in Data.Functor.Extend Methods duplicated :: K1 i c a -> K1 i c (K1 i c a) Source # extended :: (K1 i c a -> b) -> K1 i c a -> K1 i c b Source #
Semigroup m => Extend ((->) m) Source # |
Instance details Defined in Data.Functor.Extend Methods duplicated :: (m -> a) -> m -> (m -> a) Source # extended :: ((m -> a) -> b) -> (m -> a) -> m -> b Source #
Extend f => Extend (M1 i t f) Source # |
Instance details Defined in Data.Functor.Extend Methods duplicated :: M1 i t f a -> M1 i t f (M1 i t f a) Source # extended :: (M1 i t f a -> b) -> M1 i t f a -> M1 i t f b Source #

gduplicated :: (Extend (Rep1 w), Generic1 w) => w a -> w (w a) Source #

Generic `duplicated`. Caveats:

1. Will not compile if `w` is a product type.
2. Will not compile if `w` contains fields where the type variable appears underneath the composition of type constructors (e.g., `f (g a)`).

Since: 5.3.8

gextended :: (Extend (Rep1 w), Generic1 w) => (w a -> b) -> w a -> w b Source #

Generic `extended`. Caveats are the same as for `gduplicated`.

Since: 5.3.8