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 | Haskell2010 |
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 4
Just 4
>>>
[0..5] & ix 4 .~ 2
[0,1,2,3,2,5]
>>>
[0..10] ^? ix 14
Nothing
>>>
[0..5] & ix 14 .~ 2
[0,1,2,3,4,5]
The Cons
and AsEmpty
classes provide Prism
s for list constructors.
>>>
[1..10] ^? _Cons
Just (1,[2,3,4,5,6,7,8,9,10])
>>>
[] ^? _Cons
Nothing
>>>
[] ^? _Empty
Just ()
>>>
_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] ^? _Snoc
Just ([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')