functor-combinators-0.2.0.0: Tools for functor combinator-based program design

Data.HBifunctor

Contents

Description

This module provides an abstraction for "two-argument functor combinators", HBifunctor, as well as some useful combinators.

Synopsis

# Documentation

class HBifunctor (t :: (k -> Type) -> (k -> Type) -> k -> Type) where Source #

A HBifunctor is like an HFunctor, but it enhances two different functors instead of just one.

Usually, it enhaces them "together" in some sort of combining way.

This typeclass provides a uniform instance for "swapping out" or "hoisting" the enhanced functors. We can hoist the first one with hleft, the second one with hright, or both at the same time with hbimap.

For example, the f :*: g type gives us "both f and g":

data (f :*: g) a = f a :*: g a


It combines both f and g into a unified structure --- here, it does it by providing both f and g.

The single law is:

hbimap id id == id


This ensures that hleft, hright, and hbimap do not affect the structure that t adds on top of the underlying functors.

Minimal complete definition

Methods

hleft :: (f ~> j) -> t f g ~> t j g Source #

Swap out the first transformed functor.

hright :: (g ~> l) -> t f g ~> t f l Source #

Swap out the second transformed functor.

hbimap :: (f ~> j) -> (g ~> l) -> t f g ~> t j l Source #

Swap out both transformed functors at the same time.

Instances
 HBifunctor (Sum :: (k -> Type) -> (k -> Type) -> k -> Type) Source # Instance detailsDefined in Data.HFunctor.Internal Methodshleft :: (f ~> j) -> Sum f g ~> Sum j g Source #hright :: (g ~> l) -> Sum f g ~> Sum f l Source #hbimap :: (f ~> j) -> (g ~> l) -> Sum f g ~> Sum j l Source # HBifunctor ((:+:) :: (k -> Type) -> (k -> Type) -> k -> Type) Source # Instance detailsDefined in Data.HFunctor.Internal Methodshleft :: (f ~> j) -> (f :+: g) ~> (j :+: g) Source #hright :: (g ~> l) -> (f :+: g) ~> (f :+: l) Source #hbimap :: (f ~> j) -> (g ~> l) -> (f :+: g) ~> (j :+: l) Source # HBifunctor (Product :: (k -> Type) -> (k -> Type) -> k -> Type) Source # Instance detailsDefined in Data.HFunctor.Internal Methodshleft :: (f ~> j) -> Product f g ~> Product j g Source #hright :: (g ~> l) -> Product f g ~> Product f l Source #hbimap :: (f ~> j) -> (g ~> l) -> Product f g ~> Product j l Source # HBifunctor ((:*:) :: (k -> Type) -> (k -> Type) -> k -> Type) Source # Instance detailsDefined in Data.HFunctor.Internal Methodshleft :: (f ~> j) -> (f :*: g) ~> (j :*: g) Source #hright :: (g ~> l) -> (f :*: g) ~> (f :*: l) Source #hbimap :: (f ~> j) -> (g ~> l) -> (f :*: g) ~> (j :*: l) Source # HBifunctor (Joker :: (k -> Type) -> (k -> Type) -> k -> Type) Source # Instance detailsDefined in Data.HFunctor.Internal Methodshleft :: (f ~> j) -> Joker f g ~> Joker j g Source #hright :: (g ~> l) -> Joker f g ~> Joker f l Source #hbimap :: (f ~> j) -> (g ~> l) -> Joker f g ~> Joker j l Source # HBifunctor (LeftF :: (k -> Type) -> (k -> Type) -> k -> Type) Source # Instance detailsDefined in Data.HBifunctor Methodshleft :: (f ~> j) -> LeftF f g ~> LeftF j g Source #hright :: (g ~> l) -> LeftF f g ~> LeftF f l Source #hbimap :: (f ~> j) -> (g ~> l) -> LeftF f g ~> LeftF j l Source # HBifunctor (RightF :: (k -> Type) -> (k -> Type) -> k -> Type) Source # Instance detailsDefined in Data.HBifunctor Methodshleft :: (f ~> j) -> RightF f g ~> RightF j g Source #hright :: (g ~> l) -> RightF f g ~> RightF f l Source #hbimap :: (f ~> j) -> (g ~> l) -> RightF f g ~> RightF j l Source # HBifunctor (Void3 :: (k -> Type) -> (k -> Type) -> k -> Type) Source # Instance detailsDefined in Data.HFunctor.Internal Methodshleft :: (f ~> j) -> Void3 f g ~> Void3 j g Source #hright :: (g ~> l) -> Void3 f g ~> Void3 f l Source #hbimap :: (f ~> j) -> (g ~> l) -> Void3 f g ~> Void3 j l Source # HBifunctor t => HBifunctor (WrapHBF t :: (k -> Type) -> (k -> Type) -> k -> Type) Source # Instance detailsDefined in Data.HBifunctor.Associative Methodshleft :: (f ~> j) -> WrapHBF t f g ~> WrapHBF t j g Source #hright :: (g ~> l) -> WrapHBF t f g ~> WrapHBF t f l Source #hbimap :: (f ~> j) -> (g ~> l) -> WrapHBF t f g ~> WrapHBF t j l Source # Source # Instance detailsDefined in Data.HFunctor.Internal Methodshleft :: (f ~> j) -> Day f g ~> Day j g Source #hright :: (g ~> l) -> Day f g ~> Day f l Source #hbimap :: (f ~> j) -> (g ~> l) -> Day f g ~> Day j l Source # Source # Instance detailsDefined in Data.HFunctor.Internal Methodshleft :: (f ~> j) -> These1 f g ~> These1 j g Source #hright :: (g ~> l) -> These1 f g ~> These1 f l Source #hbimap :: (f ~> j) -> (g ~> l) -> These1 f g ~> These1 j l Source # HBifunctor (Comp :: (Type -> Type) -> (Type -> Type) -> Type -> Type) Source # Instance detailsDefined in Data.HFunctor.Internal Methodshleft :: (f ~> j) -> Comp f g ~> Comp j g Source #hright :: (g ~> l) -> Comp f g ~> Comp f l Source #hbimap :: (f ~> j) -> (g ~> l) -> Comp f g ~> Comp j l Source #

newtype WrappedHBifunctor t (f :: k -> Type) (g :: k -> Type) (a :: k) Source #

Useful newtype to allow us to derive an HFunctor instance from any instance of HBifunctor, using -XDerivingVia.

For example, because we have instance HBifunctor Day, we can write:

deriving via (WrappedHBifunctor Day f) instance HFunctor (Day f)


to give us an automatic HFunctor instance and save us some work.

Constructors

 WrapHBifunctor FieldsunwrapHBifunctor :: t f g a
Instances
 HBifunctor t => HFunctor (WrappedHBifunctor t f :: (k -> Type) -> k -> Type) Source # Instance detailsDefined in Data.HFunctor.Internal Methodshmap :: (f0 ~> g) -> WrappedHBifunctor t f f0 ~> WrappedHBifunctor t f g Source # Functor (t f g) => Functor (WrappedHBifunctor t f g) Source # Instance detailsDefined in Data.HFunctor.Internal Methodsfmap :: (a -> b) -> WrappedHBifunctor t f g a -> WrappedHBifunctor t f g b #(<$) :: a -> WrappedHBifunctor t f g b -> WrappedHBifunctor t f g a # overHBifunctor :: HBifunctor t => (f <~> f') -> (g <~> g') -> t f g <~> t f' g' Source # Lift two isomorphisms on each side of a bifunctor to become an isomorphism between the two bifunctor applications. Basically, if f and f' are isomorphic, and g and g' are isomorphic, then t f g is isomorphic to t f' g'. # Simple Instances newtype LeftF f g a Source # An HBifunctor that ignores its second input. Like a :+: with no R1/right branch. This is Joker from Data.Bifunctors.Joker, but given a more sensible name for its purpose. Constructors  LeftF FieldsrunLeftF :: f a Instances  HFunctor (LeftF f :: (k -> Type) -> k -> Type) Source # Instance detailsDefined in Data.HBifunctor Methodshmap :: (f0 ~> g) -> LeftF f f0 ~> LeftF f g Source # HBifunctor (LeftF :: (k -> Type) -> (k -> Type) -> k -> Type) Source # Instance detailsDefined in Data.HBifunctor Methodshleft :: (f ~> j) -> LeftF f g ~> LeftF j g Source #hright :: (g ~> l) -> LeftF f g ~> LeftF f l Source #hbimap :: (f ~> j) -> (g ~> l) -> LeftF f g ~> LeftF j l Source # Associative (LeftF :: (Type -> Type) -> (Type -> Type) -> Type -> Type) Source # Instance detailsDefined in Data.HBifunctor.Associative Associated Typestype NonEmptyBy LeftF :: (Type -> Type) -> Type -> Type Source # Methodsassociating :: (Functor f, Functor g, Functor h) => LeftF f (LeftF g h) <~> LeftF (LeftF f g) h Source # SemigroupIn (LeftF :: (Type -> Type) -> (Type -> Type) -> Type -> Type) f Source # Instance detailsDefined in Data.HBifunctor.Associative Methodsbiretract :: LeftF f f ~> f Source #binterpret :: (g ~> f) -> (h ~> f) -> LeftF g h ~> f Source # Functor f => Bifunctor (LeftF f :: Type -> Type -> Type) Source # Instance detailsDefined in Data.HBifunctor Methodsbimap :: (a -> b) -> (c -> d) -> LeftF f a c -> LeftF f b d #first :: (a -> b) -> LeftF f a c -> LeftF f b c #second :: (b -> c) -> LeftF f a b -> LeftF f a c # Traversable f => Bitraversable (LeftF f :: Type -> Type -> Type) Source # Instance detailsDefined in Data.HBifunctor Methodsbitraverse :: Applicative f0 => (a -> f0 c) -> (b -> f0 d) -> LeftF f a b -> f0 (LeftF f c d) # Foldable f => Bifoldable (LeftF f :: Type -> Type -> Type) Source # Instance detailsDefined in Data.HBifunctor Methodsbifold :: Monoid m => LeftF f m m -> m #bifoldMap :: Monoid m => (a -> m) -> (b -> m) -> LeftF f a b -> m #bifoldr :: (a -> c -> c) -> (b -> c -> c) -> c -> LeftF f a b -> c #bifoldl :: (c -> a -> c) -> (c -> b -> c) -> c -> LeftF f a b -> c # Applicative f => Biapplicative (LeftF f :: Type -> Type -> Type) Source # Instance detailsDefined in Data.HBifunctor Methodsbipure :: a -> b -> LeftF f a b #(<<*>>) :: LeftF f (a -> b) (c -> d) -> LeftF f a c -> LeftF f b d #biliftA2 :: (a -> b -> c) -> (d -> e -> f0) -> LeftF f a d -> LeftF f b e -> LeftF f c f0 #(*>>) :: LeftF f a b -> LeftF f c d -> LeftF f c d #(<<*) :: LeftF f a b -> LeftF f c d -> LeftF f a b # Functor f => Functor (LeftF f g) Source # Instance detailsDefined in Data.HBifunctor Methodsfmap :: (a -> b) -> LeftF f g a -> LeftF f g b #(<$) :: a -> LeftF f g b -> LeftF f g a # Foldable f => Foldable (LeftF f g) Source # Instance detailsDefined in Data.HBifunctor Methodsfold :: Monoid m => LeftF f g m -> m #foldMap :: Monoid m => (a -> m) -> LeftF f g a -> m #foldr :: (a -> b -> b) -> b -> LeftF f g a -> b #foldr' :: (a -> b -> b) -> b -> LeftF f g a -> b #foldl :: (b -> a -> b) -> b -> LeftF f g a -> b #foldl' :: (b -> a -> b) -> b -> LeftF f g a -> b #foldr1 :: (a -> a -> a) -> LeftF f g a -> a #foldl1 :: (a -> a -> a) -> LeftF f g a -> a #toList :: LeftF f g a -> [a] #null :: LeftF f g a -> Bool #length :: LeftF f g a -> Int #elem :: Eq a => a -> LeftF f g a -> Bool #maximum :: Ord a => LeftF f g a -> a #minimum :: Ord a => LeftF f g a -> a #sum :: Num a => LeftF f g a -> a #product :: Num a => LeftF f g a -> a # Traversable f => Traversable (LeftF f g) Source # Instance detailsDefined in Data.HBifunctor Methodstraverse :: Applicative f0 => (a -> f0 b) -> LeftF f g a -> f0 (LeftF f g b) #sequenceA :: Applicative f0 => LeftF f g (f0 a) -> f0 (LeftF f g a) #mapM :: Monad m => (a -> m b) -> LeftF f g a -> m (LeftF f g b) #sequence :: Monad m => LeftF f g (m a) -> m (LeftF f g a) # Eq1 f => Eq1 (LeftF f g) Source # Instance detailsDefined in Data.HBifunctor MethodsliftEq :: (a -> b -> Bool) -> LeftF f g a -> LeftF f g b -> Bool # Ord1 f => Ord1 (LeftF f g) Source # Instance detailsDefined in Data.HBifunctor MethodsliftCompare :: (a -> b -> Ordering) -> LeftF f g a -> LeftF f g b -> Ordering # Read1 f => Read1 (LeftF f g) Source # Instance detailsDefined in Data.HBifunctor MethodsliftReadsPrec :: (Int -> ReadS a) -> ReadS [a] -> Int -> ReadS (LeftF f g a) #liftReadList :: (Int -> ReadS a) -> ReadS [a] -> ReadS [LeftF f g a] #liftReadPrec :: ReadPrec a -> ReadPrec [a] -> ReadPrec (LeftF f g a) #liftReadListPrec :: ReadPrec a -> ReadPrec [a] -> ReadPrec [LeftF f g a] # Show1 f => Show1 (LeftF f g) Source # Instance detailsDefined in Data.HBifunctor MethodsliftShowsPrec :: (Int -> a -> ShowS) -> ([a] -> ShowS) -> Int -> LeftF f g a -> ShowS #liftShowList :: (Int -> a -> ShowS) -> ([a] -> ShowS) -> [LeftF f g a] -> ShowS # Eq (f a) => Eq (LeftF f g a) Source # Instance detailsDefined in Data.HBifunctor Methods(==) :: LeftF f g a -> LeftF f g a -> Bool #(/=) :: LeftF f g a -> LeftF f g a -> Bool # (Typeable g, Typeable a, Typeable f, Typeable k2, Typeable k1, Data (f a)) => Data (LeftF f g a) Source # Instance detailsDefined in Data.HBifunctor Methodsgfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g0. g0 -> c g0) -> LeftF f g a -> c (LeftF f g a) #gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (LeftF f g a) #toConstr :: LeftF f g a -> Constr #dataTypeOf :: LeftF f g a -> DataType #dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (LeftF f g a)) #dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (LeftF f g a)) #gmapT :: (forall b. Data b => b -> b) -> LeftF f g a -> LeftF f g a #gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> LeftF f g a -> r #gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> LeftF f g a -> r #gmapQ :: (forall d. Data d => d -> u) -> LeftF f g a -> [u] #gmapQi :: Int -> (forall d. Data d => d -> u) -> LeftF f g a -> u #gmapM :: Monad m => (forall d. Data d => d -> m d) -> LeftF f g a -> m (LeftF f g a) #gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> LeftF f g a -> m (LeftF f g a) #gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> LeftF f g a -> m (LeftF f g a) # Ord (f a) => Ord (LeftF f g a) Source # Instance detailsDefined in Data.HBifunctor Methodscompare :: LeftF f g a -> LeftF f g a -> Ordering #(<) :: LeftF f g a -> LeftF f g a -> Bool #(<=) :: LeftF f g a -> LeftF f g a -> Bool #(>) :: LeftF f g a -> LeftF f g a -> Bool #(>=) :: LeftF f g a -> LeftF f g a -> Bool #max :: LeftF f g a -> LeftF f g a -> LeftF f g a #min :: LeftF f g a -> LeftF f g a -> LeftF f g a # Read (f a) => Read (LeftF f g a) Source # Instance detailsDefined in Data.HBifunctor MethodsreadsPrec :: Int -> ReadS (LeftF f g a) #readList :: ReadS [LeftF f g a] #readPrec :: ReadPrec (LeftF f g a) #readListPrec :: ReadPrec [LeftF f g a] # Show (f a) => Show (LeftF f g a) Source # Instance detailsDefined in Data.HBifunctor MethodsshowsPrec :: Int -> LeftF f g a -> ShowS #show :: LeftF f g a -> String #showList :: [LeftF f g a] -> ShowS # Generic (LeftF f g a) Source # Instance detailsDefined in Data.HBifunctor Associated Typestype Rep (LeftF f g a) :: Type -> Type # Methodsfrom :: LeftF f g a -> Rep (LeftF f g a) x #to :: Rep (LeftF f g a) x -> LeftF f g a # type NonEmptyBy (LeftF :: (Type -> Type) -> (Type -> Type) -> Type -> Type) Source # Instance detailsDefined in Data.HBifunctor.Associative type NonEmptyBy (LeftF :: (Type -> Type) -> (Type -> Type) -> Type -> Type) = (Flagged :: (Type -> Type) -> Type -> Type) type Rep (LeftF f g a) Source # Instance detailsDefined in Data.HBifunctor type Rep (LeftF f g a) = D1 (MetaData "LeftF" "Data.HBifunctor" "functor-combinators-0.2.0.0-inplace" True) (C1 (MetaCons "LeftF" PrefixI True) (S1 (MetaSel (Just "runLeftF") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 (f a))))

newtype RightF f g a Source #

An HBifunctor that ignores its first input. Like a :+: with no L1/left branch.

In its polykinded form (on f), it is essentially a higher-order version of Tagged.

Constructors

 RightF FieldsrunRightF :: g a
Instances