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')
Documentation
prefixed :: Eq a => [a] -> Prism' [a] [a] Source #
A ReifiedPrism
stripping a prefix from a list when used as a ReifiedTraversal
, or
prepending that prefix when run backwards:
>>>
"preview" ^? prefixed "pre"
Just "view"
>>>
"review" ^? prefixed "pre"
Nothing
>>>
prefixed "pre" # "amble"
"preamble"
suffixed :: Eq a => [a] -> Prism' [a] [a] Source #
A ReifiedPrism
stripping a suffix from a list when used as a ReifiedTraversal
, or
appending that suffix when run backwards:
>>>
"review" ^? suffixed "view"
Just "re"
>>>
"review" ^? suffixed "tire"
Nothing
>>>
suffixed ".o" # "hello"
"hello.o"
stripSuffix :: Eq a => [a] -> [a] -> Maybe [a] Source #