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 | Safe-Inferred |
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"
It's possible to work under a prefix or suffix of a list using
Prefixed
and Suffixed
.
>>>
"preview" ^? prefixed "pre"
Just "view"
>>>
suffixed ".o" # "hello"
"hello.o"
At present, Data.List.Lens re-exports Prefixed
and Suffixed
for
backwards compatibility, as prefixed
and suffixed
used to be top-level
functions defined in this module. This may change in a future major release
of lens
.
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
class Prefixed t where Source #
Instances
Prefixed ByteString Source # | |
Defined in Control.Lens.Prism | |
Prefixed ByteString Source # | |
Defined in Control.Lens.Prism | |
Prefixed Text Source # | |
Prefixed Text Source # | |
Eq a => Prefixed [a] Source # | |
Defined in Control.Lens.Prism |
class Suffixed t where Source #
Instances
Suffixed ByteString Source # | |
Defined in Control.Lens.Prism | |
Suffixed ByteString Source # | |
Defined in Control.Lens.Prism | |
Suffixed Text Source # | |
Suffixed Text Source # | |
Eq a => Suffixed [a] Source # | |
Defined in Control.Lens.Prism |
stripSuffix :: Eq a => [a] -> [a] -> Maybe [a] Source #
\(\mathcal{O}(\min(m,n))\). The stripSuffix
function drops the given
suffix from a list. It returns Nothing
if the list did not end with the
suffix given, or Just
the list after the suffix, if it does.
>>>
stripSuffix "bar" "foobar"
Just "foo"
>>>
stripSuffix "foo" "foo"
Just ""
>>>
stripSuffix "bar" "barfoo"
Nothing
>>>
stripSuffix "foo" "barfoobaz"
Nothing