lens-5.1: Lenses, Folds and Traversals
Copyright(C) 2012-16 Edward Kmett
LicenseBSD-style (see the file LICENSE)
MaintainerEdward Kmett <ekmett@gmail.com>
Stabilityprovisional
Portabilityportable
Safe HaskellSafe-Inferred
LanguageHaskell2010

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 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 Prisms 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')
Synopsis

Documentation

class Prefixed t where Source #

Methods

prefixed :: t -> Prism' t t Source #

A Prism stripping a prefix from a sequence when used as a Traversal, or prepending that prefix when run backwards:

>>> "preview" ^? prefixed "pre"
Just "view"
>>> "review" ^? prefixed "pre"
Nothing
>>> prefixed "pre" # "amble"
"preamble"

Instances

Instances details
Prefixed ByteString Source # 
Instance details

Defined in Control.Lens.Prism

Prefixed ByteString Source # 
Instance details

Defined in Control.Lens.Prism

Prefixed Text Source # 
Instance details

Defined in Control.Lens.Prism

Prefixed Text Source # 
Instance details

Defined in Control.Lens.Prism

Eq a => Prefixed [a] Source # 
Instance details

Defined in Control.Lens.Prism

Methods

prefixed :: [a] -> Prism' [a] [a] Source #

class Suffixed t where Source #

Methods

suffixed :: t -> Prism' t t Source #

A Prism stripping a suffix from a sequence when used as a Traversal, or appending that suffix when run backwards:

>>> "review" ^? suffixed "view"
Just "re"
>>> "review" ^? suffixed "tire"
Nothing
>>> suffixed ".o" # "hello"
"hello.o"

Instances

Instances details
Suffixed ByteString Source # 
Instance details

Defined in Control.Lens.Prism

Suffixed ByteString Source # 
Instance details

Defined in Control.Lens.Prism

Suffixed Text Source # 
Instance details

Defined in Control.Lens.Prism

Suffixed Text Source # 
Instance details

Defined in Control.Lens.Prism

Eq a => Suffixed [a] Source # 
Instance details

Defined in Control.Lens.Prism

Methods

suffixed :: [a] -> Prism' [a] [a] Source #

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