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

Safe HaskellNone
LanguageHaskell2010

Data.Profunctor.Optic.View

Contents

Synopsis

Types

type View s a = forall p. (Strong p, CoerceR p) => Optic' p s a Source #

type Review t b = forall p. (Closed p, CoerceL p) => Optic' p t b Source #

Constructors

to :: (s -> a) -> View s a Source #

Obtain a View from an arbitrary function.

to f . to g ≡ to (g . f)
a ^. to f ≡ f a
>>> ("hello","world") ^. to snd
"world"
>>> 5 ^. to succ
6
>>> (0, -5) ^. second' . to abs
5
to :: (s -> a) -> View s a

from :: (b -> t) -> Review t b Source #

Obtain a Review from an arbitrary function.

fromre . to
>>> review (from Prelude.length) [1,2,3]
3
from :: (b -> t) -> Review t b

cloneView :: AView a s a -> View s a Source #

TODO: Document

cloneView :: Monoid a => AView a s a -> Fold s a

cloneReview :: AReview t b -> Review t b Source #

TODO: Document

Optics

like :: a -> View s a Source #

Obtain a constant-valued (index-preserving) View from an arbitrary value.

This can be useful as a second case failing a Fold e.g. foo failing like 0

like a . like b ≡ like b
a ^. like b ≡ b
a ^. like b ≡ a ^. to (const b)
like :: a -> View s a

relike :: t -> Review t b Source #

Obtain a constant-valued (index-preserving) Review from an arbitrary value.

relike a . relike b ≡ relike a
relike a # b ≡ a
relike a # b ≡ from (const a) # b

toProduct :: AView a1 s a1 -> AView a2 s a2 -> View s (a1, a2) Source #

Combine two Views into a View to a product.

toProduct :: View s a1 -> View s a2 -> View s (a1 , a2)

fromSum :: AReview t b1 -> AReview t b2 -> Review t (b1 + b2) Source #

Combine two Reviews into a Review from a sum.

fromSum :: Review t b1 -> Review t b2 -> Review t (b1 + b2)

Operators

(^.) :: s -> AView a s a -> a infixl 8 Source #

View the focus of an optic.

Fixity and semantics are such that subsequent field accesses can be performed with (.).

>>> ("hello","world") ^. second'
"world"
>>> 5 ^. to succ
6
>>> import Data.Complex
>>> ((0, 1 :+ 2), 3) ^. first' . second' . to magnitude
2.23606797749979

view :: MonadReader s m => AView a s a -> m a Source #

A prefix alias for ^..

view . toid
>>> view second' (1, "hello")
"hello"
>>> view (to succ) 5
6
>>> view (second' . first') ("hello",("world","!!!"))
"world"

views :: MonadReader s m => AView r s a -> (a -> r) -> m r Source #

Map each part of a structure viewed to a semantic editor combinator.

'views o f ≡ withFold o f'
foldMap = views folding'
>>> views both id (["foo"], ["bar", "baz"])
["foo","bar","baz"]

use :: MonadState s m => AView a s a -> m a Source #

TODO: Document

uses :: MonadState s m => Optic' (Star (Const r)) s a -> (a -> r) -> m r Source #

Use the target of a Lens, Iso or View in the current state, or use a summary of a Fold or Traversal that points to a monoidal value.

>>> evalState (uses first' length) ("hello","world!")
5

review :: MonadReader b m => AReview t b -> m t Source #

A prefix alias of .^.

reviewview . re
review . fromid
>>> review left' 4
Left 4
>>> review (from succ) 5
6

reviews :: MonadReader b m => AReview t b -> (t -> r) -> m r Source #

Turn an optic around and look through the other end, applying a function.

reviewsviews . re
reviews (from f) g ≡ g . f
>>> reviews left' isRight "mustard"
False
>>> reviews (from succ) (*2) 3
8

reuse :: MonadState b m => AReview t b -> m t Source #

Turn an optic around and use a value (or the current environment) through it the other way.

reuseuse . re
reuse . fromgets
>>> evalState (reuse left') 5
Left 5
>>> evalState (reuse (from succ)) 5
6

reuses :: MonadState b m => AReview t b -> (t -> r) -> m r Source #

Turn an optic around and use the current state through it the other way, applying a function.

reusesuses . re
reuses (from f) g ≡ gets (g . f)
>>> evalState (reuses left' isLeft) (5 :: Int)
True