| Copyright | (C) 2012-14 Edward Kmett |
|---|---|
| License | BSD-style (see the file LICENSE) |
| Maintainer | Edward Kmett <ekmett@gmail.com> |
| Stability | experimental |
| Portability | non-portable |
| Safe Haskell | Trustworthy |
| Language | Haskell98 |
Control.Lens.Cons
Description
- class Cons s t a b | s -> a, t -> b, s b -> t, t a -> s where
- (<|) :: Cons s s a a => a -> s -> s
- cons :: Cons s s a a => a -> s -> s
- uncons :: Cons s s a a => s -> Maybe (a, s)
- _head :: Cons s s a a => Traversal' s a
- _tail :: Cons s s a a => Traversal' s s
- class Snoc s t a b | s -> a, t -> b, s b -> t, t a -> s where
- (|>) :: Snoc s s a a => s -> a -> s
- snoc :: Snoc s s a a => s -> a -> s
- unsnoc :: Snoc s s a a => s -> Maybe (s, a)
- _init :: Snoc s s a a => Traversal' s s
- _last :: Snoc s s a a => Traversal' s a
Cons
class Cons s t a b | s -> a, t -> b, s b -> t, t a -> s where Source
This class provides a way to attach or detach elements on the left side of a structure in a flexible manner.
Minimal complete definition
Nothing
Methods
Instances
| Cons ByteString ByteString Word8 Word8 | |
| Cons ByteString ByteString Word8 Word8 | |
| Cons Text Text Char Char | |
| Cons Text Text Char Char | |
| Cons [a] [b] a b | |
| Cons (Seq a) (Seq b) a b | |
| Cons (Vector a) (Vector b) a b | |
| (Unbox a, Unbox b) => Cons (Vector a) (Vector b) a b | |
| (Storable a, Storable b) => Cons (Vector a) (Vector b) a b | |
| (Prim a, Prim b) => Cons (Vector a) (Vector b) a b | |
| Cons (Deque a) (Deque b) a b |
cons :: Cons s s a a => a -> s -> s infixr 5 Source
cons an element onto a container.
>>>cons a [][a]
>>>cons a [b, c][a,b,c]
>>>cons a (Seq.fromList [])fromList [a]
>>>cons a (Seq.fromList [b, c])fromList [a,b,c]
uncons :: Cons s s a a => s -> Maybe (a, s) Source
Attempt to extract the left-most element from a container, and a version of the container without that element.
>>>uncons []Nothing
>>>uncons [a, b, c]Just (a,[b,c])
_head :: Cons s s a a => Traversal' s a Source
A Traversal reading and writing to the head of a non-empty container.
>>>[a,b,c]^? _headJust a
>>>[a,b,c] & _head .~ d[d,b,c]
>>>[a,b,c] & _head %~ f[f a,b,c]
>>>[] & _head %~ f[]
>>>[1,2,3]^?!_head1
>>>[]^?_headNothing
>>>[1,2]^?_headJust 1
>>>[] & _head .~ 1[]
>>>[0] & _head .~ 2[2]
>>>[0,1] & _head .~ 2[2,1]
This isn't limited to lists.
For instance you can also traverse the head of a Seq:
>>>Seq.fromList [a,b,c,d] & _head %~ ffromList [f a,b,c,d]
>>>Seq.fromList [] ^? _headNothing
>>>Seq.fromList [a,b,c,d] ^? _headJust a
_head::Traversal'[a] a_head::Traversal'(Seqa) a_head::Traversal'(Vectora) a
_tail :: Cons s s a a => Traversal' s s Source
A Traversal reading and writing to the tail of a non-empty container.
>>>[a,b] & _tail .~ [c,d,e][a,c,d,e]
>>>[] & _tail .~ [a,b][]
>>>[a,b,c,d,e] & _tail.traverse %~ f[a,f b,f c,f d,f e]
>>>[1,2] & _tail .~ [3,4,5][1,3,4,5]
>>>[] & _tail .~ [1,2][]
>>>[a,b,c]^?_tailJust [b,c]
>>>[1,2]^?!_tail[2]
>>>"hello"^._tail"ello"
>>>""^._tail""
This isn't limited to lists. For instance you can also traverse the tail of a Seq.
>>>Seq.fromList [a,b] & _tail .~ Seq.fromList [c,d,e]fromList [a,c,d,e]
>>>Seq.fromList [a,b,c] ^? _tailJust (fromList [b,c])
>>>Seq.fromList [] ^? _tailNothing
_tail::Traversal'[a] [a]_tail::Traversal'(Seqa) (Seqa)_tail::Traversal'(Vectora) (Vectora)
Snoc
class Snoc s t a b | s -> a, t -> b, s b -> t, t a -> s where Source
This class provides a way to attach or detach elements on the right side of a structure in a flexible manner.
Minimal complete definition
Nothing
Methods
Instances
| Snoc ByteString ByteString Word8 Word8 | |
| Snoc ByteString ByteString Word8 Word8 | |
| Snoc Text Text Char Char | |
| Snoc Text Text Char Char | |
| Snoc [a] [b] a b | |
| Snoc (Seq a) (Seq b) a b | |
| Snoc (Vector a) (Vector b) a b | |
| (Unbox a, Unbox b) => Snoc (Vector a) (Vector b) a b | |
| (Storable a, Storable b) => Snoc (Vector a) (Vector b) a b | |
| (Prim a, Prim b) => Snoc (Vector a) (Vector b) a b | |
| Snoc (Deque a) (Deque b) a b |
snoc :: Snoc s s a a => s -> a -> s infixl 5 Source
snoc an element onto the end of a container.
>>>snoc (Seq.fromList []) afromList [a]
>>>snoc (Seq.fromList [b, c]) afromList [b,c,a]
>>>snoc (LazyT.pack "hello") '!'"hello!"
unsnoc :: Snoc s s a a => s -> Maybe (s, a) Source
Attempt to extract the right-most element from a container, and a version of the container without that element.
>>>unsnoc (LazyT.pack "hello!")Just ("hello",'!')
>>>unsnoc (LazyT.pack "")Nothing
>>>unsnoc (Seq.fromList [b,c,a])Just (fromList [b,c],a)
>>>unsnoc (Seq.fromList [])Nothing
_init :: Snoc s s a a => Traversal' s s Source
A Traversal reading and replacing all but the a last element of a non-empty container.
>>>[a,b,c,d]^?_initJust [a,b,c]
>>>[]^?_initNothing
>>>[a,b] & _init .~ [c,d,e][c,d,e,b]
>>>[] & _init .~ [a,b][]
>>>[a,b,c,d] & _init.traverse %~ f[f a,f b,f c,d]
>>>[1,2,3]^?_initJust [1,2]
>>>[1,2,3,4]^?!_init[1,2,3]
>>>"hello"^._init"hell"
>>>""^._init""
_init::Traversal'[a] [a]_init::Traversal'(Seqa) (Seqa)_init::Traversal'(Vectora) (Vectora)
_last :: Snoc s s a a => Traversal' s a Source
A Traversal reading and writing to the last element of a non-empty container.
>>>[a,b,c]^?!_lastc
>>>[]^?_lastNothing
>>>[a,b,c] & _last %~ f[a,b,f c]
>>>[1,2]^?_lastJust 2
>>>[] & _last .~ 1[]
>>>[0] & _last .~ 2[2]
>>>[0,1] & _last .~ 2[0,2]
This Traversal is not limited to lists, however. We can also work with other containers, such as a Vector.
>>>Vector.fromList "abcde" ^? _lastJust 'e'
>>>Vector.empty ^? _lastNothing
>>>Vector.fromList "abcde" & _last .~ 'Q'fromList "abcdQ"
_last::Traversal'[a] a_last::Traversal'(Seqa) a_last::Traversal'(Vectora) a