| Copyright | (C) 2012-16 Edward Kmett |
|---|---|
| License | BSD-style (see the file LICENSE) |
| Maintainer | Edward Kmett <ekmett@gmail.com> |
| Stability | provisional |
| Portability | portable |
| Safe Haskell | None |
| Language | Haskell98 |
Data.List.Lens
Description
Traversals for manipulating parts of a list.
Additional optics for manipulating lists are present more generically in this package.
The Ixed class allows traversing the element at a
specific list index.
>>>[0..10] ^? ix 4Just 4
>>>[0..5] & ix 4 .~ 2[0,1,2,3,2,5]
>>>[0..10] ^? ix 14Nothing
>>>[0..5] & ix 14 .~ 2[0,1,2,3,4,5]
The Cons and AsEmpty
classes provide Prisms for list constructors.
>>>[1..10] ^? _ConsJust (1,[2,3,4,5,6,7,8,9,10])
>>>[] ^? _ConsNothing
>>>[] ^? _EmptyJust ()
>>>_Cons # (1, _Empty # ()) :: [Int][1]
Additionally, Snoc provides a
Prism for accessing the end of a list. Note
that this Prism always will need to traverse
the whole list.
>>>[1..5] ^? _SnocJust ([1,2,3,4],5)
>>>_Snoc # ([1,2],5)[1,2,5]
An instance of Plated allows for finding
locations in the list where a traversal matches.
>>>[Nothing, Just 7, Just 3, Nothing] & deep (ix 0 . _Just) +~ 10[Nothing,Just 17,Just 3,Nothing]
An instance of Reversing provides an
Iso between a list and its reverse.
>>>"live" & reversed %~ ('d':)"lived"
Finally, it's possible to traverse, fold over, and map over
index-value pairs thanks to instances of
TraversableWithIndex,
FoldableWithIndex, and
FunctorWithIndex.
>>>imap (,) "Hello"[(0,'H'),(1,'e'),(2,'l'),(3,'l'),(4,'o')]
>>>ifoldMap replicate "Hello""ellllloooo"
>>>itraverse_ (curry print) "Hello"(0,'H') (1,'e') (2,'l') (3,'l') (4,'o')