dependent-map-0.3: Dependent finite maps (partial dependent products)

Safe HaskellSafe
LanguageHaskell98

Data.Dependent.Map.Lens

Contents

Description

Some functions for using lenses with DMap.

Synopsis

At

dmat :: (GCompare k, Functor f) => k v -> (Maybe (g v) -> f (Maybe (g v))) -> DMap k g -> f (DMap k g) Source #

These functions have been specialised for use with DMap but without any of the specific lens types used so that we have compatilibity without needing the dependency just for these functions.

This is equivalent to the at Lens' from Control.Lens.At:

type Lens s t a b = forall f. Functor f => (a -> f b) -> s -> f t

at :: Index m -> Lens' m (Maybe (IxValue m))

So the type of dmat is equivalent to:

dmat :: GCompare k => Lens' (DMap k f) (Maybe (f v))
>>> DMap.fromList [AInt :=> Identity 33, AFloat :=> Identity 3.5] & dmat AString ?~ "Hat"
DMap.fromList [AString :=> Identity "Hat", AInt :=> Identity 33, AFloat :=> Identity 3.5]
>>> DMap.fromList [AString :=> Identity "Shoe", AInt :=> Identity 33, AFloat :=> Identity 3.5] ^? dmat AFloat
Just (AFloat :=> 3.5)

Ix

dmix :: (GCompare k, Applicative f) => k v -> (g v -> f (g v)) -> DMap k g -> f (DMap k g) Source #

This is equivalent to the ix Traversal' from Control.Lens.At:

type Traversal s t a b = forall f. Applicative f => (a -> f b) -> s -> f t

ix :: Index m -> Traversal' m (IxValue m)

So the type of dmix is equivalent to:

dmix :: GCompare k => k v -> Traversal' (DMap k f) (f v)

NB: Setting the value of this Traversal will only set the value in dmix if it is already present.

If you want to be able to insert missing values, you want dmat.

>>> DMap.fromList [AString :=> Identity "Shoe", AInt :=> Identity 33, AFloat :=> Identity 3.5] & dmix AInt %~ f
DMap.fromList [AString :=> Identity "Shoe", AInt :=> Identity (f 33), AFloat :=> Identity 3.5]
>>> DMap.fromList [AString :=> Identity "Shoe", AInt :=> Identity 33, AFloat :=> Identity 3.5] & dmix AString .~ "Hat"
DMap.fromList [AString :=> Identity "Hat", AInt :=> Identity 33, AFloat :=> Identity 3.5]
>>> DMap.fromList [AString :=> Identity "Shoe", AInt :=> Identity 33, AFloat :=> Identity 3.5] ^? dmix AFloat
Just (AFloat :=> 3.5)
>>> DMap.fromList [AString :=> Identity "Shoe", AFloat :=> Identity 3.5] ^? dmix AInt
Nothing