profunctor-optics-0.0.2: A compact optics library compatible with the typeclasses in profunctors.

Data.Profunctor.Optic.Prism

Synopsis

# Prism & Cxprism

type Prism s t a b = forall p. Choice p => Optic p s t a b Source #

$$\mathsf{Prism}\;S\;A = \exists D, S \cong D + A$$

type Prism' s a = Prism s s a a Source #

type Coprism s t a b = forall p. Cochoice p => Optic p s t a b Source #

$$\mathsf{Prism}\;S\;A = \exists D, S + D \cong A$$

type Coprism' t b = Coprism t t b b Source #

prism :: (s -> t + a) -> (b -> t) -> Prism s t a b Source #

Obtain a Prism from a constructor and a matcher function.

Caution: In order for the generated optic to be well-defined, you must ensure that the input functions satisfy the following properties:

• sta (bt b) ≡ Right b
• (id ||| bt) (sta s) ≡ s
• left sta (sta s) ≡ left Left (sta s)

More generally, a profunctor optic must be monoidal as a natural transformation:

• o id ≡ id
• o (Procompose p q) ≡ Procompose (o p) (o q)

See Property.

prism' :: (s -> Maybe a) -> (a -> s) -> Prism' s a Source #

Obtain a Prism' from a reviewer and a matcher function that produces a Maybe.

handling :: (s -> c + a) -> ((c + b) -> t) -> Prism s t a b Source #

Obtain a Prism from its free tensor representation.

Useful for constructing prisms from try and handle functions.

clonePrism :: APrism s t a b -> Prism s t a b Source #

TODO: Document

coprism :: (s -> a) -> (b -> a + t) -> Coprism s t a b Source #

Obtain a Cochoice optic from a constructor and a matcher function.

coprism f g ≡ f g -> re (prism f g)


Caution: In order for the generated optic to be well-defined, you must ensure that the input functions satisfy the following properties:

• bat (bt b) ≡ Right b
• (id ||| bt) (bat b) ≡ b
• left bat (bat b) ≡ left Left (bat b)

A Coprism is a View, so you can specialise types to obtain:

 view :: Coprism' s a -> s -> a

coprism' :: (s -> a) -> (a -> Maybe s) -> Coprism' s a Source #

Create a Coprism from a reviewer and a matcher function that produces a Maybe.

rehandling :: ((c + s) -> a) -> (b -> c + t) -> Coprism s t a b Source #

Obtain a Coprism from its free tensor representation.

cloneCoprism :: ACoprism s t a b -> Coprism s t a b Source #

TODO: Document

# Optics

just :: Prism (Maybe a) (Maybe b) a b Source #

Focus on the Just constructor of Maybe.

>>> Just 1 :| [Just 2, Just 3] & withCostar just sum
Just 6
>>> Nothing :| [Just 2, Just 3] & withCostar just sum
Nothing


cojust :: Coprism a b (Maybe a) (Maybe b) Source #

Unfocus on the Just constructor of Maybe.

nothing :: Prism (Maybe a) (Maybe b) () () Source #

Focus on the Nothing constructor of Maybe.

prefixed :: Eq a => [a] -> Prism' [a] [a] Source #

Focus on the remainder of a list with a given prefix.

only :: Eq a => a -> Prism' a () Source #

Focus not just on a case, but a specific value of that case.

nearly :: a -> (a -> Bool) -> Prism' a () Source #

Create a Prism from a value and a predicate.

>>> review (nearly [] null) ()
[]
>>> [1,2,3,4] ^? nearly [] null
Nothing

nearly [] null :: Prism' [a] ()

Caution: In order for the generated optic to be well-defined, you must ensure that f x holds iff x ≡ a.

nthbit :: Bits s => Int -> Prism' s () Source #

Focus on the truth value of the nth bit in a bit array.

# Primitive operators

withPrism :: APrism s t a b -> ((s -> t + a) -> (b -> t) -> r) -> r Source #

Extract the two functions that characterize a Prism.

# Operators

aside :: APrism s t a b -> Prism (e, s) (e, t) (e, a) (e, b) Source #

Use a Prism to lift part of a structure.

without :: APrism s t a b -> APrism u v c d -> Prism (s + u) (t + v) (a + c) (b + d) Source #

Given a pair of prisms, project sums.

below :: Traversable f => APrism' s a -> Prism' (f s) (f a) Source #

Lift a Prism through a Traversable functor.

Returns a Prism that matches only if each element matches the original Prism.

>>> [Left 1, Right "foo", Left 4, Right "woot"] ^.. below right'
[]
>>> [Right "hail hydra!", Right "foo", Right "blah", Right "woot"] ^.. below right'
[["hail hydra!","foo","blah","woot"]]


toPastroSum :: APrism s t a b -> p a b -> PastroSum p s t Source #

Use a Prism to construct a PastroSum.

toTambaraSum :: Choice p => APrism s t a b -> p a b -> TambaraSum p s t Source #

Use a Prism to construct a TambaraSum.

# Classes

class Profunctor p => Choice (p :: Type -> Type -> Type) where #

The generalization of Costar of Functor that is strong with respect to Either.

Note: This is also a notion of strength, except with regards to another monoidal structure that we can choose to equip Hask with: the cocartesian coproduct.

Minimal complete definition

Methods

left' :: p a b -> p (Either a c) (Either b c) #

Laws:

left' ≡ dimap swapE swapE . right' where
swapE :: Either a b -> Either b a
swapE = either Right Left
rmap Left ≡ lmap Left . left'
lmap (right f) . left' ≡ rmap (right f) . left'
left' . left' ≡ dimap assocE unassocE . left' where
assocE :: Either (Either a b) c -> Either a (Either b c)
assocE (Left (Left a)) = Left a
assocE (Left (Right b)) = Right (Left b)
assocE (Right c) = Right (Right c)
unassocE :: Either a (Either b c) -> Either (Either a b) c
unassocE (Left a) = Left (Left a)
unassocE (Right (Left b)) = Left (Right b)
unassocE (Right (Right c)) = Right c


right' :: p a b -> p (Either c a) (Either c b) #

Laws:

right' ≡ dimap swapE swapE . left' where
swapE :: Either a b -> Either b a
swapE = either Right Left
rmap Right ≡ lmap Right . right'
lmap (left f) . right' ≡ rmap (left f) . right'
right' . right' ≡ dimap unassocE assocE . right' where
assocE :: Either (Either a b) c -> Either a (Either b c)
assocE (Left (Left a)) = Left a
assocE (Left (Right b)) = Right (Left b)
assocE (Right c) = Right (Right c)
unassocE :: Either a (Either b c) -> Either (Either a b) c
unassocE (Left a) = Left (Left a)
unassocE (Right (Left b)) = Left (Right b)
unassocE (Right (Right c)) = Right c

Instances
 Monad m => Choice (Kleisli m) Instance detailsDefined in Data.Profunctor.Choice Methodsleft' :: Kleisli m a b -> Kleisli m (Either a c) (Either b c) #right' :: Kleisli m a b -> Kleisli m (Either c a) (Either c b) # Choice p => Choice (Yoneda p) Instance detailsDefined in Data.Profunctor.Yoneda Methodsleft' :: Yoneda p a b -> Yoneda p (Either a c) (Either b c) #right' :: Yoneda p a b -> Yoneda p (Either c a) (Either c b) # Choice p => Choice (Coyoneda p) Instance detailsDefined in Data.Profunctor.Yoneda Methodsleft' :: Coyoneda p a b -> Coyoneda p (Either a c) (Either b c) #right' :: Coyoneda p a b -> Coyoneda p (Either c a) (Either c b) # Profunctor p => Choice (TambaraSum p) Instance detailsDefined in Data.Profunctor.Choice Methodsleft' :: TambaraSum p a b -> TambaraSum p (Either a c) (Either b c) #right' :: TambaraSum p a b -> TambaraSum p (Either c a) (Either c b) # Instance detailsDefined in Data.Profunctor.Choice Methodsleft' :: PastroSum p a b -> PastroSum p (Either a c) (Either b c) #right' :: PastroSum p a b -> PastroSum p (Either c a) (Either c b) # Choice p => Choice (Tambara p) Instance detailsDefined in Data.Profunctor.Choice Methodsleft' :: Tambara p a b -> Tambara p (Either a c) (Either b c) #right' :: Tambara p a b -> Tambara p (Either c a) (Either c b) # Applicative f => Choice (Star f) Instance detailsDefined in Data.Profunctor.Choice Methodsleft' :: Star f a b -> Star f (Either a c) (Either b c) #right' :: Star f a b -> Star f (Either c a) (Either c b) # Coapplicative f => Choice (Costar f) Source # Instance detailsDefined in Data.Profunctor.Optic.Types Methodsleft' :: Costar f a b -> Costar f (Either a c) (Either b c) #right' :: Costar f a b -> Costar f (Either c a) (Either c b) # Instance detailsDefined in Data.Profunctor.Choice Methodsleft' :: WrappedArrow p a b -> WrappedArrow p (Either a c) (Either b c) #right' :: WrappedArrow p a b -> WrappedArrow p (Either c a) (Either c b) # Monoid r => Choice (Forget r) Instance detailsDefined in Data.Profunctor.Choice Methodsleft' :: Forget r a b -> Forget r (Either a c) (Either b c) #right' :: Forget r a b -> Forget r (Either c a) (Either c b) # Choice (Lin a) Instance detailsDefined in Data.Semimodule.Free Methodsleft' :: Lin a a0 b -> Lin a (Either a0 c) (Either b c) #right' :: Lin a a0 b -> Lin a (Either c a0) (Either c b) # Choice (Tagged :: Type -> Type -> Type) Instance detailsDefined in Data.Profunctor.Choice Methodsleft' :: Tagged a b -> Tagged (Either a c) (Either b c) #right' :: Tagged a b -> Tagged (Either c a) (Either c b) # Source # Instance detailsDefined in Data.Profunctor.Optic.Carrier Methodsleft' :: Conjoin j a b -> Conjoin j (Either a c) (Either b c) #right' :: Conjoin j a b -> Conjoin j (Either c a) (Either c b) # Source # Instance detailsDefined in Data.Profunctor.Optic.Carrier Methodsleft' :: Fold0Rep r a b -> Fold0Rep r (Either a c) (Either b c) #right' :: Fold0Rep r a b -> Fold0Rep r (Either c a) (Either c b) # Choice ((->) :: Type -> Type -> Type) Instance detailsDefined in Data.Profunctor.Choice Methodsleft' :: (a -> b) -> Either a c -> Either b c #right' :: (a -> b) -> Either c a -> Either c b # Comonad w => Choice (Cokleisli w) extract approximates costrength Instance detailsDefined in Data.Profunctor.Choice Methodsleft' :: Cokleisli w a b -> Cokleisli w (Either a c) (Either b c) #right' :: Cokleisli w a b -> Cokleisli w (Either c a) (Either c b) # Source # Instance detailsDefined in Data.Profunctor.Optic.Carrier Methodsleft' :: Cotraversal0Rep a b a0 b0 -> Cotraversal0Rep a b (Either a0 c) (Either b0 c) #right' :: Cotraversal0Rep a b a0 b0 -> Cotraversal0Rep a b (Either c a0) (Either c b0) # Choice (Traversal0Rep a b) Source # Instance detailsDefined in Data.Profunctor.Optic.Carrier Methodsleft' :: Traversal0Rep a b a0 b0 -> Traversal0Rep a b (Either a0 c) (Either b0 c) #right' :: Traversal0Rep a b a0 b0 -> Traversal0Rep a b (Either c a0) (Either c b0) # Choice (PrismRep a b) Source # Instance detailsDefined in Data.Profunctor.Optic.Carrier Methodsleft' :: PrismRep a b a0 b0 -> PrismRep a b (Either a0 c) (Either b0 c) #right' :: PrismRep a b a0 b0 -> PrismRep a b (Either c a0) (Either c b0) # Functor f => Choice (Joker f :: Type -> Type -> Type) Instance detailsDefined in Data.Profunctor.Choice Methodsleft' :: Joker f a b -> Joker f (Either a c) (Either b c) #right' :: Joker f a b -> Joker f (Either c a) (Either c b) # Cochoice p => Choice (Re p s t) Source # Instance detailsDefined in Data.Profunctor.Optic.Types Methodsleft' :: Re p s t a b -> Re p s t (Either a c) (Either b c) #right' :: Re p s t a b -> Re p s t (Either c a) (Either c b) # (Choice p, Choice q) => Choice (Sum p q) Instance detailsDefined in Data.Profunctor.Choice Methodsleft' :: Sum p q a b -> Sum p q (Either a c) (Either b c) #right' :: Sum p q a b -> Sum p q (Either c a) (Either c b) # (Choice p, Choice q) => Choice (Product p q) Instance detailsDefined in Data.Profunctor.Choice Methodsleft' :: Product p q a b -> Product p q (Either a c) (Either b c) #right' :: Product p q a b -> Product p q (Either c a) (Either c b) # (Functor f, Choice p) => Choice (Tannen f p) Instance detailsDefined in Data.Profunctor.Choice Methodsleft' :: Tannen f p a b -> Tannen f p (Either a c) (Either b c) #right' :: Tannen f p a b -> Tannen f p (Either c a) (Either c b) #