16 | ||| Empty vector
18 | ||| A non-empty vector of length `S len`, consisting of a head element and
19 | ||| the rest of the list, of length `len`.
22 | -- Hints for interactive editing
30 | ||| Show that the length function on vectors in fact calculates the length
31 | export
36 | export
40 | export
44 | export
48 | --------------------------------------------------------------------------------
49 | -- Indexing into vectors
50 | --------------------------------------------------------------------------------
52 | export
57 | ||| All but the first element of the vector
58 | |||
59 | ||| ```idris example
60 | ||| tail [1,2,3,4]
61 | ||| ```
66 | ||| Only the first element of the vector
67 | |||
68 | ||| ```idris example
69 | ||| head [1,2,3,4]
70 | ||| ```
75 | export
79 | ||| The last element of the vector
80 | |||
81 | ||| ```idris example
82 | ||| last [1,2,3,4]
83 | ||| ```
89 | ||| All but the last element of the vector
90 | |||
91 | ||| ```idris example
92 | ||| init [1,2,3,4]
93 | ||| ```
99 | ||| Extract the first `n` elements of a Vect.
108 | ||| Take precisely n elements from the stream.
109 | ||| @ n how many elements to take
110 | ||| @ xs the stream
116 | ||| Drop the first `n` elements of a Vect.
122 | ||| Drop up to the first `n` elements of a Vect.
129 | ||| Generate all of the Fin elements as a Vect whose length is the number of
130 | ||| elements.
131 | |||
132 | ||| Useful, for example, when one wants all the indices for specific Vect.
135 | -- implemented using `map`, so the definition is further down
137 | ||| Extract a particular element from a vector
138 | |||
139 | ||| ```idris example
140 | ||| index 1 [1,2,3,4]
141 | ||| ```
147 | ||| Insert an element at a particular index
148 | |||
149 | ||| ```idris example
150 | ||| insertAt 1 8 [1,2,3,4]
151 | ||| ```
157 | ||| Construct a new vector consisting of all but the indicated element
158 | |||
159 | ||| ```idris example
160 | ||| deleteAt 1 [1,2,3,4]
161 | ||| ```
168 | ||| Replace an element at a particular index with another
169 | |||
170 | ||| ```idris example
171 | ||| replaceAt 1 8 [1,2,3,4]
172 | ||| ```
178 | ||| Replace the element at a particular index with the result of applying a function to it
179 | ||| @ i the index to replace at
180 | ||| @ f the update function
181 | ||| @ xs the vector to replace in
182 | |||
183 | ||| ```idris example
184 | ||| updateAt 1 (+10) [1,2,3,4]
185 | ||| ```
191 | ||| Append two vectors
192 | |||
193 | ||| ```idris example
194 | ||| [1,2,3,4] ++ [5,6]
195 | ||| ```
201 | ||| Add an element at the end of the vector.
202 | ||| The main use case for it is to get the expected type signature
203 | ||| `Vect n a -> a -> Vect (S n) a` instead of
204 | ||| `Vect n a -> a -> Vect (n + 1) a` which you get by using `++ [x]`
205 | |||
206 | ||| Snoc gets its name by reversing `cons`, indicating we are
207 | ||| tacking on the element at the end rather than the beginning.
208 | ||| `append` would also be a suitable name.
209 | |||
210 | ||| @ xs The vector to be appended
211 | ||| @ v The value to append
217 | ||| Pop the last element from a vector. This is the opposite of `snoc`, in that
218 | ||| `(uncurry snoc) unsnoc xs` is `xs`. It is equivalent to `(init xs, last xs)`,
219 | ||| but traverses the vector once.
220 | |||
221 | ||| @ xs The vector to pop the element from.
227 | ||| Repeat some value some number of times.
228 | |||
229 | ||| @ len the number of times to repeat it
230 | ||| @ x the value to repeat
231 | |||
232 | ||| ```idris example
233 | ||| replicate 4 1
234 | ||| ```
240 | ||| Merge two ordered vectors
241 | |||
242 | ||| ```idris example
243 | ||| mergeBy compare (fromList [1,3,5]) (fromList [2,3,4,5,6])
244 | ||| ```
245 | export
246 | mergeBy : (elem -> elem -> Ordering) -> (xs : Vect n elem) -> (ys : Vect m elem) -> Vect (n + m) elem
255 | export
259 | -- Properties for functions in this section --
261 | export
262 | replaceAtSameIndex : (xs : Vect n a) -> (i : Fin n) -> (0 y : a) -> index i (replaceAt i y xs) = y
266 | export
267 | replaceAtDiffIndexPreserves : (xs : Vect n a) -> (i, j : Fin n) -> Not (i = j) -> (0 y : a) -> index i (replaceAt j y xs) = index i xs
271 | replaceAtDiffIndexPreserves (_::_) (FS z) (FS w) co y = replaceAtDiffIndexPreserves _ z w (\zw => co $ cong FS zw) y
273 | --------------------------------------------------------------------------------
274 | -- Transformations
275 | --------------------------------------------------------------------------------
277 | ||| Reverse the second vector, prepending the result to the first.
278 | |||
279 | ||| ```idris example
280 | ||| reverseOnto [0, 1] [10, 11, 12]
281 | ||| ```
288 | ||| Reverse the order of the elements of a vector
289 | |||
290 | ||| ```idris example
291 | ||| reverse [1,2,3,4]
292 | ||| ```
297 | ||| Alternate an element between the other elements of a vector
298 | ||| @ sep the element to intersperse
299 | ||| @ xs the vector to separate with `sep`
300 | |||
301 | ||| ```idris example
302 | ||| intersperse 0 [1,2,3,4]
303 | ||| ```
304 | export
308 | where
314 | --------------------------------------------------------------------------------
315 | -- Conversion from list (toList is provided by Foldable)
316 | --------------------------------------------------------------------------------
326 | ||| Convert a list to a vector.
327 | |||
328 | ||| The length of the list should be statically known.
329 | |||
330 | ||| ```idris example
331 | ||| fromList [1,2,3,4]
332 | ||| ```
345 | --------------------------------------------------------------------------------
346 | -- Equality
347 | --------------------------------------------------------------------------------
359 | --------------------------------------------------------------------------------
360 | -- Order
361 | --------------------------------------------------------------------------------
371 | --------------------------------------------------------------------------------
372 | -- Maps
373 | --------------------------------------------------------------------------------
380 | ||| Map a partial function across a vector, returning those elements for which
381 | ||| the function had a value.
382 | |||
383 | ||| The first projection of the resulting pair (ie the length) will always be
384 | ||| at most the length of the input vector. This is not, however, guaranteed
385 | ||| by the type.
386 | |||
387 | ||| @ f the partial function (expressed by returning `Maybe`)
388 | ||| @ xs the vector to check for results
389 | |||
390 | ||| ```idris example
391 | ||| mapMaybe ((find (=='a')) . unpack) (fromList ["abc","ade","bgh","xyz"])
392 | ||| ```
393 | export
402 | -- now that we have `map`, we can finish implementing `allFins`
406 | --------------------------------------------------------------------------------
407 | -- Folds
408 | --------------------------------------------------------------------------------
415 | export
416 | foldrImplGoLemma
437 | --------------------------------------------------------------------------------
438 | -- Special folds
439 | --------------------------------------------------------------------------------
441 | ||| Flatten a vector of equal-length vectors
442 | |||
443 | ||| ```idris example
444 | ||| concat [[1,2,3], [4,5,6]]
445 | ||| ```
451 | ||| Foldr without seeding the accumulator
452 | |||
453 | ||| ```idris example
454 | ||| foldr1 (-) (fromList [1,2,3])
455 | ||| ```
461 | ||| Foldl without seeding the accumulator
462 | |||
463 | ||| ```idris example
464 | ||| foldl1 (-) (fromList [1,2,3])
465 | ||| ```
470 | --------------------------------------------------------------------------------
471 | -- Scans
472 | --------------------------------------------------------------------------------
474 | ||| The scanr function is similar to foldr, but returns all the intermediate
475 | ||| accumulator states in the form of a vector. Note the intermediate accumulator
476 | ||| states appear in the result in reverse order - the first state appears last
477 | ||| in the result.
478 | |||
479 | ||| ```idris example
480 | ||| scanr (-) 0 (fromList [1,2,3])
481 | ||| ```
487 | ||| The scanr1 function is a variant of scanr that doesn't require an explicit
488 | ||| starting value.
489 | ||| It assumes the last element of the vector to be the starting value and then
490 | ||| starts the fold with the element preceding it.
491 | |||
492 | ||| ```idris example
493 | ||| scanr1 (-) (fromList [1,2,3])
494 | ||| ```
500 | ||| The scanl function is similar to foldl, but returns all the intermediate
501 | ||| accumulator states in the form of a vector.
502 | |||
503 | ||| ```idris example
504 | ||| scanl (-) 0 (fromList [1,2,3])
505 | ||| ```
511 | ||| The scanl1 function is a variant of scanl that doesn't require an explicit
512 | ||| starting value.
513 | ||| It assumes the first element of the vector to be the starting value and then
514 | ||| starts the fold with the element following it.
515 | |||
516 | ||| ```idris example
517 | ||| scanl1 (-) (fromList [1,2,3])
518 | ||| ```
524 | --------------------------------------------------------------------------------
525 | -- Membership tests
526 | --------------------------------------------------------------------------------
528 | ||| Find the association of some key with a user-provided comparison
529 | ||| @ p the comparison operator for keys (True if they match)
530 | ||| @ e the key to look for
531 | |||
532 | ||| ```idris example
533 | ||| lookupBy (==) 2 [(1, 'a'), (2, 'b'), (3, 'c')]
534 | ||| ```
540 | ||| Find the association of some key using the default Boolean equality test
541 | |||
542 | ||| ```idris example
543 | ||| lookup 3 [(1, 'a'), (2, 'b'), (3, 'c')]
544 | ||| ```
549 | ||| Check if any element of xs is found in elems by a user-provided comparison
550 | ||| @ p the comparison operator
551 | ||| @ elems the vector to search
552 | ||| @ xs what to search for
553 | |||
554 | ||| ```idris example
555 | ||| hasAnyBy (==) [2,5] [1,2,3,4]
556 | ||| ```
558 | hasAnyBy : (p : elem -> elem -> Bool) -> (elems : Vect m elem) -> (xs : Vect len elem) -> Bool
562 | ||| Check if any element of xs is found in elems using the default Boolean equality test
563 | |||
564 | ||| ```idris example
565 | ||| hasAny [2,5] [1,2,3,4]
566 | ||| ```
571 | --------------------------------------------------------------------------------
572 | -- Searching with a predicate
573 | --------------------------------------------------------------------------------
575 | ||| Find the first element of the vector that satisfies some test
576 | ||| @ p the test to satisfy
577 | |||
578 | ||| ```idris example
579 | ||| find (== 3) [1,2,3,4]
580 | ||| ```
586 | ||| Find the index of the first element of the vector that satisfies some test
587 | |||
588 | ||| ```idris example
589 | ||| findIndex (== 3) [1,2,3,4]
590 | ||| ```
596 | ||| Find the indices of all elements that satisfy some test
597 | |||
598 | ||| ```idris example
599 | ||| findIndices (< 3) [1,2,3,4]
600 | ||| ```
608 | ||| Find the index of the first element of the vector that satisfies some test
609 | |||
610 | ||| ```idris example
611 | ||| elemIndexBy (==) 3 [1,2,3,4]
612 | ||| ```
617 | ||| Find the index of the first element of the vector equal to the given one.
618 | |||
619 | ||| ```idris example
620 | ||| elemIndex 3 [1,2,3,4]
621 | ||| ```
626 | ||| Find the indices of all elements that satisfy some test
627 | |||
628 | ||| ```idris example
629 | ||| elemIndicesBy (<=) 3 [1,2,3,4]
630 | ||| ```
635 | ||| Find the indices of all elements equal to the given one
636 | |||
637 | ||| ```idris example
638 | ||| elemIndices 3 [1,2,3,4,3]
639 | ||| ```
644 | --------------------------------------------------------------------------------
645 | -- Filters
646 | --------------------------------------------------------------------------------
648 | ||| Find all elements of a vector that satisfy some test
649 | |||
650 | ||| ```idris example
651 | ||| filter (< 3) (fromList [1,2,3,4])
652 | ||| ```
660 | else
671 | ||| Make the elements of some vector unique by some test
672 | |||
673 | ||| ```idris example
674 | ||| nubBy (==) (fromList [1,2,2,3,4,4])
675 | ||| ```
680 | ||| Make the elements of some vector unique by the default Boolean equality
681 | |||
682 | ||| ```idris example
683 | ||| nub (fromList [1,2,2,3,4,4])
684 | ||| ```
689 | ||| Delete first element from list according to some test
690 | |||
691 | ||| ```idris example
692 | ||| deleteBy (<) 3 (fromList [1,2,2,3,4,4])
693 | ||| ```
702 | ||| Delete first element from list equal to the given one
703 | |||
704 | ||| ```idris example
705 | ||| delete 2 (fromList [1,2,2,3,4,4])
706 | ||| ```
712 | --------------------------------------------------------------------------------
713 | -- Splitting and breaking vects
714 | --------------------------------------------------------------------------------
716 | ||| A tuple where the first element is a `Vect` of the `n` first elements and
717 | ||| the second element is a `Vect` of the remaining elements of the original.
718 | ||| It is equivalent to `(take n xs, drop n xs)` (`splitAtTakeDrop`),
719 | ||| but is more efficient.
720 | |||
721 | ||| @ n the index to split at
722 | ||| @ xs the `Vect` to split in two
723 | |||
724 | ||| ```idris example
725 | ||| splitAt 2 (fromList [1,2,3,4])
726 | ||| ```
733 | ||| A tuple where the first element is a `Vect` of the `n` elements passing given test
734 | ||| and the second element is a `Vect` of the remaining elements of the original.
735 | |||
736 | ||| ```idris example
737 | ||| partition (== 2) (fromList [1,2,3,2,4])
738 | ||| ```
746 | else
749 | ||| Split a vector whose length is a multiple of two numbers, k times n, into k
750 | ||| sections of length n.
751 | |||
752 | ||| ```idris example
753 | ||| > kSplits 2 4 [1, 2, 3, 4, 5, 6, 7, 8]
754 | ||| [[1, 2, 3, 4], [5, 6, 7, 8]]
755 | ||| ```
762 | ||| Split a vector whose length is a multiple of two numbers, k times n, into n
763 | ||| sections of length k.
764 | |||
765 | ||| ```idris example
766 | ||| > nSplits 2 4 [1, 2, 3, 4, 5, 6, 7, 8]
767 | ||| [[1, 5], [2, 6], [3, 7], [4, 8]]
768 | ||| ```
771 | -- implemented via matrix transposition, so the definition is further down
773 | --------------------------------------------------------------------------------
774 | -- Predicates
775 | --------------------------------------------------------------------------------
777 | ||| Verify vector prefix
778 | |||
779 | ||| ```idris example
780 | ||| isPrefixOfBy (==) (fromList [1,2]) (fromList [1,2,3,4])
781 | ||| ```
788 | ||| Verify vector prefix
789 | |||
790 | ||| ```idris example
791 | ||| isPrefixOf (fromList [1,2]) (fromList [1,2,3,4])
792 | ||| ```
797 | ||| Verify vector suffix
798 | |||
799 | ||| ```idris example
800 | ||| isSuffixOfBy (==) (fromList [3,4]) (fromList [1,2,3,4])
801 | ||| ```
806 | ||| Verify vector suffix
807 | |||
808 | ||| ```idris example
809 | ||| isSuffixOf (fromList [3,4]) (fromList [1,2,3,4])
810 | ||| ```
815 | --------------------------------------------------------------------------------
816 | -- Conversions
817 | --------------------------------------------------------------------------------
819 | ||| Convert Maybe type into Vect
820 | |||
821 | ||| ```idris example
822 | ||| maybeToVect (Just 2)
823 | ||| ```
829 | ||| Convert first element of Vect (if exists) into Maybe.
830 | |||
831 | ||| ```idris example
832 | ||| vectToMaybe [2]
833 | ||| ```
839 | --------------------------------------------------------------------------------
840 | -- Misc
841 | --------------------------------------------------------------------------------
843 | ||| Filter out Nothings from Vect and unwrap the Justs
844 | |||
845 | ||| ```idris example
846 | ||| catMaybes [Just 1, Just 2, Nothing, Nothing, Just 5]
847 | ||| ```
856 | ||| Get diagonal elements
857 | |||
858 | ||| ```idris example
859 | ||| diag [[1,2,3], [4,5,6], [7,8,9]]
860 | ||| ```
890 | --------------------------------------------------------------------------------
891 | -- Zippable
892 | --------------------------------------------------------------------------------
912 | export
913 | zipWithIndexLinear : (0 f : _) -> (xs, ys : Vect n a) -> (i : Fin n) -> index i (zipWith f xs ys) = f (index i xs) (index i ys)
917 | export
918 | zipWith3IndexLinear : (0 f : _) -> (xs, ys, zs : Vect n a) -> (i : Fin n) -> index i (zipWith3 f xs ys zs) = f (index i xs) (index i ys) (index i zs)
922 | --------------------------------------------------------------------------------
923 | -- Permutation
924 | --------------------------------------------------------------------------------
926 | ||| Rearrange the elements of a vector according to some permutation of its
927 | ||| indices.
928 | ||| @ v the vector whose elements to rearrange
929 | ||| @ p the permutation to apply
930 | |||
931 | ||| ```idris example
932 | ||| > permute ['a', 'b', 'c', 'd'] [0, 3, 2, 1]
933 | ||| ['a', 'd' , 'c' ,'b']
934 | ||| ```
935 | export
939 | --------------------------------------------------------------------------------
940 | -- Matrix transposition
941 | --------------------------------------------------------------------------------
943 | ||| Transpose a `Vect` of `Vect`s, turning rows into columns and vice versa.
944 | |||
945 | ||| This is like zipping all the inner `Vect`s together and is equivalent to `traverse id` (`transposeTraverse`).
946 | |||
947 | ||| As the types ensure rectangularity, this is an involution, unlike `Prelude.List.transpose`.
948 | |||
949 | ||| ```idris example
950 | ||| transpose [[1,2], [3,4], [5,6], [7,8]]
951 | ||| ```
957 | -- nSplits from earlier on
960 | --------------------------------------------------------------------------------
961 | -- Applicative/Monad/Traversable
962 | --------------------------------------------------------------------------------
963 | -- These only work if the length is known at run time!
970 | -- ||| This monad is different from the List monad, (>>=)
971 | -- ||| uses the diagonal.
981 | --------------------------------------------------------------------------------
982 | -- Semigroup/Monoid
983 | --------------------------------------------------------------------------------
993 | --------------------------------------------------------------------------------
994 | -- Show
995 | --------------------------------------------------------------------------------
997 | export
1001 | -- Some convenience functions for testing lengths
1003 | -- Needs to be Maybe rather than Dec, because if 'n' is unequal to m, we
1004 | -- only know we don't know how to make a Vect n a, not that one can't exist.
1005 | export
1012 | ||| If the given Vect is at least the required length, return a Vect with
1013 | ||| at least that length in its type, otherwise return Nothing
1014 | ||| @len the required length
1015 | ||| @xs the vector with the desired length
1016 | export