distributors-0.3.0.0: Unifying Parsers, Printers & Grammars
Copyright(C) 2026 - Eitan Chatav
LicenseBSD-style (see the file LICENSE)
MaintainerEitan Chatav <eitan.chatav@gmail.com>
Stabilityprovisional
Portabilitynon-portable
Safe HaskellSafe-Inferred
LanguageHaskell2010

Data.Profunctor.Monoidal

Description

 
Synopsis

Monoidal

type Monoidal p = (Profunctor p, forall x. Applicative (p x)) Source #

A lax Monoidal product Profunctor has unit oneP and product >*< lax monoidal structure morphisms. This is equivalent to the Profunctor also being Applicative.

Laws:

>>> let lunit = dimap (\((),a) -> a) (\a -> ((),a))
>>> let runit = dimap (\(a,()) -> a) (\a -> (a,()))
>>> let assoc = dimap (\(a,(b,c)) -> ((a,b),c)) (\((a,b),c) -> (a,(b,c)))
oneP >*< p = lunit p
p >*< oneP = runit p
p >*< q >*< r = assoc ((p >*< q) >*< r)
dimap (f >*< g) (h >*< i) (p >*< q) = dimap f h p >*< dimap g i q

oneP :: Monoidal p => p () () Source #

oneP is the unit of a Monoidal Profunctor.

(>*<) :: Monoidal p => p a b -> p c d -> p (a, c) (b, d) infixr 5 Source #

>*< is the product of a Monoidal Profunctor.

(>*) :: Monoidal p => p () c -> p a b -> p a b infixl 6 Source #

>* sequences actions, discarding the value of the first argument; analagous to *>, extending it to Monoidal.

oneP >* p = p

(*<) :: Monoidal p => p a b -> p () c -> p a b infixl 6 Source #

*< sequences actions, discarding the value of the second argument; analagous to <*, extending it to Monoidal.

p *< oneP = p

dimap2 :: Monoidal p => (s -> a) -> (s -> c) -> (b -> d -> t) -> p a b -> p c d -> p s t Source #

dimap2 is a curried, functionalized form of >*<, analagous to liftA2.

foreverP :: Monoidal p => p () c -> p a b Source #

foreverP repeats an action indefinitely; analagous to forever, extending it to Monoidal.

ditraverse :: (Traversable t, Distributive t, Monoidal p) => p a b -> p (t a) (t b) Source #

Thanks to Fy on Monoidal Café Discord.

A Traversable & Distributive type is a homogeneous countable product. That means it is a static length container, so unlike replicateP, ditraverse does not need an Int argument.

Monoidal & Choice

replicateP :: (Monoidal p, Choice p, AsEmpty s, AsEmpty t, Cons s t a b) => Int -> p a b -> p s t Source #

replicateP is analagous to replicateM, for Monoidal & Choice Profunctors.

(>:<) :: (Cons s t a b, Monoidal p, Choice p) => p a b -> p s t -> p s t infixr 5 Source #

A Monoidal & Choice cons operator.

asEmpty :: (AsEmpty s, Monoidal p, Choice p) => p s s Source #

A Monoidal & Choice nil operator.

meander :: (Monoidal p, Choice p) => ATraversal s t a b -> p a b -> p s t Source #

For any Monoidal, Choice & Strong Profunctor, meander is invertible and gives a default implementation for the wander method of Traversing, though Strong is not needed for its definition.

See Pickering, Gibbons & Wu, Profunctor Optics - Modular Data Accessors

eotFunList :: Iso (Bazaar (->) a1 b1 t1) (Bazaar (->) a2 b2 t2) (Either t1 (a1, Bazaar (->) a1 b1 (b1 -> t1))) (Either t2 (a2, Bazaar (->) a2 b2 (b2 -> t2))) Source #

eotFunList is used to define meander. See van Laarhoven, A non-regular data type challenge, both post and comments, for details.

Orphan instances

Arrow p => Profunctor (WrappedArrow p) Source # 
Instance details

Methods

dimap :: (a -> b) -> (c -> d) -> WrappedArrow p b c -> WrappedArrow p a d #

lmap :: (a -> b) -> WrappedArrow p b c -> WrappedArrow p a c #

rmap :: (b -> c) -> WrappedArrow p a b -> WrappedArrow p a c #

(#.) :: forall a b c q. Coercible c b => q b c -> WrappedArrow p a b -> WrappedArrow p a c #

(.#) :: forall a b c q. Coercible b a => WrappedArrow p b c -> q a b -> WrappedArrow p a c #

(Profunctor p, Alternative (p a)) => Alternative (Coyoneda p a) Source # 
Instance details

Methods

empty :: Coyoneda p a a0 #

(<|>) :: Coyoneda p a a0 -> Coyoneda p a a0 -> Coyoneda p a a0 #

some :: Coyoneda p a a0 -> Coyoneda p a [a0] #

many :: Coyoneda p a a0 -> Coyoneda p a [a0] #

(Profunctor p, Alternative (p a)) => Alternative (Yoneda p a) Source # 
Instance details

Methods

empty :: Yoneda p a a0 #

(<|>) :: Yoneda p a a0 -> Yoneda p a a0 -> Yoneda p a a0 #

some :: Yoneda p a a0 -> Yoneda p a [a0] #

many :: Yoneda p a a0 -> Yoneda p a [a0] #

(Profunctor p, Applicative (p a)) => Applicative (Coyoneda p a) Source # 
Instance details

Methods

pure :: a0 -> Coyoneda p a a0 #

(<*>) :: Coyoneda p a (a0 -> b) -> Coyoneda p a a0 -> Coyoneda p a b #

liftA2 :: (a0 -> b -> c) -> Coyoneda p a a0 -> Coyoneda p a b -> Coyoneda p a c #

(*>) :: Coyoneda p a a0 -> Coyoneda p a b -> Coyoneda p a b #

(<*) :: Coyoneda p a a0 -> Coyoneda p a b -> Coyoneda p a a0 #

(Profunctor p, Applicative (p a)) => Applicative (Yoneda p a) Source # 
Instance details

Methods

pure :: a0 -> Yoneda p a a0 #

(<*>) :: Yoneda p a (a0 -> b) -> Yoneda p a a0 -> Yoneda p a b #

liftA2 :: (a0 -> b -> c) -> Yoneda p a a0 -> Yoneda p a b -> Yoneda p a c #

(*>) :: Yoneda p a a0 -> Yoneda p a b -> Yoneda p a b #

(<*) :: Yoneda p a a0 -> Yoneda p a b -> Yoneda p a a0 #

(Closed p, Distributive f) => Closed (WrappedPafb f p) Source # 
Instance details

Methods

closed :: WrappedPafb f p a b -> WrappedPafb f p (x -> a) (x -> b) #

(Profunctor p, Alternative (p a), Applicative f) => Alternative (WrappedPafb f p a) Source # 
Instance details

Methods

empty :: WrappedPafb f p a a0 #

(<|>) :: WrappedPafb f p a a0 -> WrappedPafb f p a a0 -> WrappedPafb f p a a0 #

some :: WrappedPafb f p a a0 -> WrappedPafb f p a [a0] #

many :: WrappedPafb f p a a0 -> WrappedPafb f p a [a0] #

(Profunctor p, Applicative (p a), Applicative f) => Applicative (WrappedPafb f p a) Source # 
Instance details

Methods

pure :: a0 -> WrappedPafb f p a a0 #

(<*>) :: WrappedPafb f p a (a0 -> b) -> WrappedPafb f p a a0 -> WrappedPafb f p a b #

liftA2 :: (a0 -> b -> c) -> WrappedPafb f p a a0 -> WrappedPafb f p a b -> WrappedPafb f p a c #

(*>) :: WrappedPafb f p a a0 -> WrappedPafb f p a b -> WrappedPafb f p a b #

(<*) :: WrappedPafb f p a a0 -> WrappedPafb f p a b -> WrappedPafb f p a a0 #

Monoid r => Applicative (Forget r a :: Type -> Type) Source # 
Instance details

Methods

pure :: a0 -> Forget r a a0 #

(<*>) :: Forget r a (a0 -> b) -> Forget r a a0 -> Forget r a b #

liftA2 :: (a0 -> b -> c) -> Forget r a a0 -> Forget r a b -> Forget r a c #

(*>) :: Forget r a a0 -> Forget r a b -> Forget r a b #

(<*) :: Forget r a a0 -> Forget r a b -> Forget r a a0 #

Decidable f => Applicative (Clown f a :: Type -> Type) Source # 
Instance details

Methods

pure :: a0 -> Clown f a a0 #

(<*>) :: Clown f a (a0 -> b) -> Clown f a a0 -> Clown f a b #

liftA2 :: (a0 -> b -> c) -> Clown f a a0 -> Clown f a b -> Clown f a c #

(*>) :: Clown f a a0 -> Clown f a b -> Clown f a b #

(<*) :: Clown f a a0 -> Clown f a b -> Clown f a a0 #

Applicative f => Applicative (Joker f a) Source # 
Instance details

Methods

pure :: a0 -> Joker f a a0 #

(<*>) :: Joker f a (a0 -> b) -> Joker f a a0 -> Joker f a b #

liftA2 :: (a0 -> b -> c) -> Joker f a a0 -> Joker f a b -> Joker f a c #

(*>) :: Joker f a a0 -> Joker f a b -> Joker f a b #

(<*) :: Joker f a a0 -> Joker f a b -> Joker f a a0 #

Arrow p => Applicative (WrappedArrow p a) Source # 
Instance details

Methods

pure :: a0 -> WrappedArrow p a a0 #

(<*>) :: WrappedArrow p a (a0 -> b) -> WrappedArrow p a a0 -> WrappedArrow p a b #

liftA2 :: (a0 -> b -> c) -> WrappedArrow p a a0 -> WrappedArrow p a b -> WrappedArrow p a c #

(*>) :: WrappedArrow p a a0 -> WrappedArrow p a b -> WrappedArrow p a b #

(<*) :: WrappedArrow p a a0 -> WrappedArrow p a b -> WrappedArrow p a a0 #

Arrow p => Functor (WrappedArrow p a) Source # 
Instance details

Methods

fmap :: (a0 -> b) -> WrappedArrow p a a0 -> WrappedArrow p a b #

(<$) :: a0 -> WrappedArrow p a b -> WrappedArrow p a a0 #

(Monoidal p, Monoidal q) => Applicative (Product p q a) Source # 
Instance details

Methods

pure :: a0 -> Product p q a a0 #

(<*>) :: Product p q a (a0 -> b) -> Product p q a a0 -> Product p q a b #

liftA2 :: (a0 -> b -> c) -> Product p q a a0 -> Product p q a b -> Product p q a c #

(*>) :: Product p q a a0 -> Product p q a b -> Product p q a b #

(<*) :: Product p q a a0 -> Product p q a b -> Product p q a a0 #

(Applicative f, Applicative (p a)) => Applicative (Cayley f p a) Source # 
Instance details

Methods

pure :: a0 -> Cayley f p a a0 #

(<*>) :: Cayley f p a (a0 -> b) -> Cayley f p a a0 -> Cayley f p a b #

liftA2 :: (a0 -> b -> c) -> Cayley f p a a0 -> Cayley f p a b -> Cayley f p a c #

(*>) :: Cayley f p a a0 -> Cayley f p a b -> Cayley f p a b #

(<*) :: Cayley f p a a0 -> Cayley f p a b -> Cayley f p a a0 #

(Monoidal p, Applicative (q a)) => Applicative (Procompose p q a) Source # 
Instance details

Methods

pure :: a0 -> Procompose p q a a0 #

(<*>) :: Procompose p q a (a0 -> b) -> Procompose p q a a0 -> Procompose p q a b #

liftA2 :: (a0 -> b -> c) -> Procompose p q a a0 -> Procompose p q a b -> Procompose p q a c #

(*>) :: Procompose p q a a0 -> Procompose p q a b -> Procompose p q a b #

(<*) :: Procompose p q a a0 -> Procompose p q a b -> Procompose p q a a0 #

(Functor f, Functor (p a)) => Functor (Cayley f p a) Source # 
Instance details

Methods

fmap :: (a0 -> b) -> Cayley f p a a0 -> Cayley f p a b #

(<$) :: a0 -> Cayley f p a b -> Cayley f p a a0 #