Data.Dependent.Map.Lens

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

Safe Haskell | Safe-Inferred
Language | Haskell98

Data.Dependent.Map.Lens

Contents

- At
- Ix

Description

Some functions for using lenses with `DMap`.

Synopsis

- dmat :: forall {k1} k2 f (v :: k1) g. (GCompare k2, Functor f) => k2 v -> (Maybe (g v) -> f (Maybe (g v))) -> DMap k2 g -> f (DMap k2 g)
- dmix :: forall {k1} k2 f (v :: k1) g. (GCompare k2, Applicative f) => k2 v -> (g v -> f (g v)) -> DMap k2 g -> f (DMap k2 g)

# At

dmat :: forall {k1} k2 f (v :: k1) g. (GCompare k2, Functor f) => k2 v -> (Maybe (g v) -> f (Maybe (g v))) -> DMap k2 g -> f (DMap k2 g) #

These functions have been specialised for use with `DMap` but without any of the specific `lens` types used so that we have compatibility 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 :: forall {k1} k2 f (v :: k1) g. (GCompare k2, Applicative f) => k2 v -> (g v -> f (g v)) -> DMap k2 g -> f (DMap k2 g) #

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