| Copyright | (C) 2014-2015 Edward Kmett |
|---|---|
| License | BSD-style (see the file LICENSE) |
| Maintainer | Edward Kmett <ekmett@gmail.com> |
| Stability | experimental |
| Portability | non-portable |
| Safe Haskell | Safe |
| Language | Haskell98 |
Data.Map.Lens
Description
One of most commonly-asked questions about this package is whether
it provides lenses for working with Map. It does, but their uses
are perhaps obscured by their genericity. This module exists to provide
documentation for them.
Map is an instance of At, so we have a lenses
on values at keys:
>>>Map.fromList [(1, "world")] ^.at 1Just "world"
>>>at 1 .~ Just "world" $ Map.emptyfromList [(1,"world")]
>>>at 0 ?~ "hello" $ Map.emptyfromList [(0,"hello")]
We can traverse, fold over, and map over key-value pairs in a
Map, thanks to its TraversableWithIndex,
FoldableWithIndex, and
FunctorWithIndex instances.
>>>imap const $ Map.fromList [(1, "Venus")]fromList [(1,1)]
>>>ifoldMap (\i _ -> Sum i) $ Map.fromList [(2, "Earth"), (3, "Mars")]Sum {getSum = 5}
>>>itraverse_ (curry print) $ Map.fromList [(4, "Jupiter")](4,"Jupiter")
>>>itoList $ Map.fromList [(5, "Saturn")][(5,"Saturn")]
A related class, Ixed, allows us to use
ix to traverse a value at a particular key.
>>>ix 2 %~ ("New " ++) $ Map.fromList [(2, "Earth")]fromList [(2,"New Earth")]
>>>preview (ix 8) $ Map.emptyNothing
Additionally, Map has TraverseMin and
TraverseMax instances, which let us traverse over
the value at the least and greatest keys, respectively.
>>>preview traverseMin $ Map.fromList [(5, "Saturn"), (6, "Uranus")]Just "Saturn"
>>>preview traverseMax $ Map.fromList [(5, "Saturn"), (6, "Uranus")]Just "Uranus"