Copyright | (C) 2012-16 Edward Kmett |
---|---|
License | BSD-style (see the file LICENSE) |
Maintainer | Edward Kmett <ekmett@gmail.com> |
Stability | provisional |
Portability | Rank2Types |
Safe Haskell | Trustworthy |
Language | Haskell2010 |
Synopsis
- type family Magnified (m :: * -> *) :: * -> * -> *
- class ( Magnified m ~ Magnified n, MonadReader b m, MonadReader a n) => Magnify m n b a | m -> b, n -> a, m a -> n, n b -> m where
- class ( MonadState s m, MonadState t n) => Zoom m n s t | m -> s, n -> t, m t -> n, n s -> m where
- type family Zoomed (m :: * -> *) :: * -> * -> *
Documentation
type family Magnified (m :: * -> *) :: * -> * -> * Source #
This type family is used by
Magnify
to describe the common effect type.
Instances
type Magnified ( IdentityT m) Source # | |
Defined in Control.Lens.Zoom |
|
type Magnified ( ReaderT b m) Source # | |
Defined in Control.Lens.Zoom |
|
type Magnified ((->) b :: Type -> Type ) Source # | |
type Magnified ( RWST a w s m) Source # | |
Defined in Control.Lens.Zoom |
|
type Magnified ( RWST a w s m) Source # | |
Defined in Control.Lens.Zoom |
class ( Magnified m ~ Magnified n, MonadReader b m, MonadReader a n) => Magnify m n b a | m -> b, n -> a, m a -> n, n b -> m where Source #
This class allows us to use
magnify
part of the environment, changing the environment supplied by
many different
Monad
transformers. Unlike
zoom
this can change the environment of a deeply nested
Monad
transformer.
Also, unlike
zoom
, this can be used with any valid
Getter
, but cannot be used with a
Traversal
or
Fold
.
magnify :: (( Functor ( Magnified m c), Contravariant ( Magnified m c)) => LensLike' ( Magnified m c) a b) -> m c -> n c infixr 2 Source #
Run a monadic action in a larger environment than it was defined in, using a
Getter
.
This acts like
local
, but can in many cases change the type of the environment as well.
This is commonly used to lift actions in a simpler
Reader
Monad
into a
Monad
with a larger environment type.
This can be used to edit pretty much any
Monad
transformer stack with an environment in it:
>>>
(1,2) & magnify _2 (+1)
3
>>>
flip Reader.runReader (1,2) $ magnify _1 Reader.ask
1
>>>
flip Reader.runReader (1,2,[10..20]) $ magnify (_3._tail) Reader.ask
[11,12,13,14,15,16,17,18,19,20]
The type can be read as
magnify :: LensLike' (Magnified m c) a b -> m c -> n c
but the higher-rank constraints make it easier to apply
magnify
to a
Getter
in highly-polymorphic code.
magnify
::Getter
s a -> (a -> r) -> s -> rmagnify
::Monoid
r =>Fold
s a -> (a -> r) -> s -> r
magnify
::Monoid
w =>Getter
s t ->RWS
t w st c ->RWS
s w st cmagnify
:: (Monoid
w,Monoid
c) =>Fold
s a ->RWS
a w st c ->RWS
s w st c ...
Instances
Magnify m n b a => Magnify ( IdentityT m) ( IdentityT n) b a Source # | |
Monad m => Magnify ( ReaderT b m) ( ReaderT a m) b a Source # | |
Magnify ((->) b :: Type -> Type ) ((->) a :: Type -> Type ) b a Source # |
|
Defined in Control.Lens.Zoom |
|
( Monad m, Monoid w) => Magnify ( RWST b w s m) ( RWST a w s m) b a Source # | |
( Monad m, Monoid w) => Magnify ( RWST b w s m) ( RWST a w s m) b a Source # | |
class ( MonadState s m, MonadState t n) => Zoom m n s t | m -> s, n -> t, m t -> n, n s -> m where Source #
This class allows us to use
zoom
in, changing the
State
supplied by
many different
Monad
transformers, potentially quite
deep in a
Monad
transformer stack.
zoom :: LensLike' ( Zoomed m c) t s -> m c -> n c infixr 2 Source #
Run a monadic action in a larger
State
than it was defined in,
using a
Lens'
or
Traversal'
.
This is commonly used to lift actions in a simpler
State
Monad
into a
State
Monad
with a larger
State
type.
When applied to a
Traversal'
over
multiple values, the actions for each target are executed sequentially
and the results are aggregated.
This can be used to edit pretty much any
Monad
transformer stack with a
State
in it!
>>>
flip State.evalState (a,b) $ zoom _1 $ use id
a
>>>
flip State.execState (a,b) $ zoom _1 $ id .= c
(c,b)
>>>
flip State.execState [(a,b),(c,d)] $ zoom traverse $ _2 %= f
[(a,f b),(c,f d)]
>>>
flip State.runState [(a,b),(c,d)] $ zoom traverse $ _2 <%= f
(f b <> f d <> mempty,[(a,f b),(c,f d)])
>>>
flip State.evalState (a,b) $ zoom both (use id)
a <> b
zoom
::Monad
m =>Lens'
s t ->StateT
t m a ->StateT
s m azoom
:: (Monad
m,Monoid
c) =>Traversal'
s t ->StateT
t m c ->StateT
s m czoom
:: (Monad
m,Monoid
w) =>Lens'
s t ->RWST
r w t m c ->RWST
r w s m czoom
:: (Monad
m,Monoid
w,Monoid
c) =>Traversal'
s t ->RWST
r w t m c ->RWST
r w s m czoom
:: (Monad
m,Monoid
w,Error
e) =>Lens'
s t ->ErrorT
e (RWST
r w t m) c ->ErrorT
e (RWST
r w s m) czoom
:: (Monad
m,Monoid
w,Monoid
c,Error
e) =>Traversal'
s t ->ErrorT
e (RWST
r w t m) c ->ErrorT
e (RWST
r w s m) c ...
Instances
Zoom m n s t => Zoom ( MaybeT m) ( MaybeT n) s t Source # | |
Zoom m n s t => Zoom ( ListT m) ( ListT n) s t Source # | |
Zoom m n s t => Zoom ( IdentityT m) ( IdentityT n) s t Source # | |
Zoom m n s t => Zoom ( ExceptT e m) ( ExceptT e n) s t Source # | |
( Functor f, Zoom m n s t) => Zoom ( FreeT f m) ( FreeT f n) s t Source # | |
( Error e, Zoom m n s t) => Zoom ( ErrorT e m) ( ErrorT e n) s t Source # | |
Zoom m n s t => Zoom ( ReaderT e m) ( ReaderT e n) s t Source # | |
Monad z => Zoom ( StateT s z) ( StateT t z) s t Source # | |
Monad z => Zoom ( StateT s z) ( StateT t z) s t Source # | |
( Monoid w, Zoom m n s t) => Zoom ( WriterT w m) ( WriterT w n) s t Source # | |
( Monoid w, Zoom m n s t) => Zoom ( WriterT w m) ( WriterT w n) s t Source # | |
( Monoid w, Monad z) => Zoom ( RWST r w s z) ( RWST r w t z) s t Source # | |
( Monoid w, Monad z) => Zoom ( RWST r w s z) ( RWST r w t z) s t Source # | |
type family Zoomed (m :: * -> *) :: * -> * -> * Source #
This type family is used by
Zoom
to describe the common effect type.
Instances
type Zoomed ( MaybeT m) Source # | |
Defined in Control.Lens.Zoom |
|
type Zoomed ( ListT m) Source # | |
Defined in Control.Lens.Zoom |
|
type Zoomed ( IdentityT m) Source # | |
Defined in Control.Lens.Zoom |
|
type Zoomed ( ExceptT e m) Source # | |
Defined in Control.Lens.Zoom |
|
type Zoomed ( FreeT f m) Source # | |
Defined in Control.Lens.Zoom |
|
type Zoomed ( ErrorT e m) Source # | |
Defined in Control.Lens.Zoom |
|
type Zoomed ( ReaderT e m) Source # | |
Defined in Control.Lens.Zoom |
|
type Zoomed ( StateT s z) Source # | |
Defined in Control.Lens.Zoom |
|
type Zoomed ( StateT s z) Source # | |
Defined in Control.Lens.Zoom |
|
type Zoomed ( WriterT w m) Source # | |
Defined in Control.Lens.Zoom |
|
type Zoomed ( WriterT w m) Source # | |
Defined in Control.Lens.Zoom |
|
type Zoomed ( RWST r w s z) Source # | |
Defined in Control.Lens.Zoom |
|
type Zoomed ( RWST r w s z) Source # | |
Defined in Control.Lens.Zoom |