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 | --------------------------------------------------------------------------------
333 | ||| Convert a list to a vector.
334 | |||
335 | ||| The length of the list should be statically known.
336 | |||
337 | ||| ```idris example
338 | ||| fromList [1,2,3,4]
339 | ||| ```
346 | --------------------------------------------------------------------------------
347 | -- Equality
348 | --------------------------------------------------------------------------------
360 | --------------------------------------------------------------------------------
361 | -- Order
362 | --------------------------------------------------------------------------------
372 | --------------------------------------------------------------------------------
373 | -- Maps
374 | --------------------------------------------------------------------------------
381 | ||| Map a partial function across a vector, returning those elements for which
382 | ||| the function had a value.
383 | |||
384 | ||| The first projection of the resulting pair (ie the length) will always be
385 | ||| at most the length of the input vector. This is not, however, guaranteed
386 | ||| by the type.
387 | |||
388 | ||| @ f the partial function (expressed by returning `Maybe`)
389 | ||| @ xs the vector to check for results
390 | |||
391 | ||| ```idris example
392 | ||| mapMaybe ((find (=='a')) . unpack) (fromList ["abc","ade","bgh","xyz"])
393 | ||| ```
394 | export
403 | -- now that we have `map`, we can finish implementing `allFins`
407 | --------------------------------------------------------------------------------
408 | -- Folds
409 | --------------------------------------------------------------------------------
416 | export
417 | foldrImplGoLemma
438 | --------------------------------------------------------------------------------
439 | -- Special folds
440 | --------------------------------------------------------------------------------
442 | ||| Flatten a vector of equal-length vectors
443 | |||
444 | ||| ```idris example
445 | ||| concat [[1,2,3], [4,5,6]]
446 | ||| ```
452 | ||| Foldr without seeding the accumulator
453 | |||
454 | ||| ```idris example
455 | ||| foldr1 (-) (fromList [1,2,3])
456 | ||| ```
462 | ||| Foldl without seeding the accumulator
463 | |||
464 | ||| ```idris example
465 | ||| foldl1 (-) (fromList [1,2,3])
466 | ||| ```
471 | --------------------------------------------------------------------------------
472 | -- Scans
473 | --------------------------------------------------------------------------------
475 | ||| The scanr function is similar to foldr, but returns all the intermediate
476 | ||| accumulator states in the form of a vector. Note the intermediate accumulator
477 | ||| states appear in the result in reverse order - the first state appears last
478 | ||| in the result.
479 | |||
480 | ||| ```idris example
481 | ||| scanr (-) 0 (fromList [1,2,3])
482 | ||| ```
488 | ||| The scanr1 function is a variant of scanr that doesn't require an explicit
489 | ||| starting value.
490 | ||| It assumes the last element of the vector to be the starting value and then
491 | ||| starts the fold with the element preceding it.
492 | |||
493 | ||| ```idris example
494 | ||| scanr1 (-) (fromList [1,2,3])
495 | ||| ```
501 | ||| The scanl function is similar to foldl, but returns all the intermediate
502 | ||| accumulator states in the form of a vector.
503 | |||
504 | ||| ```idris example
505 | ||| scanl (-) 0 (fromList [1,2,3])
506 | ||| ```
512 | ||| The scanl1 function is a variant of scanl that doesn't require an explicit
513 | ||| starting value.
514 | ||| It assumes the first element of the vector to be the starting value and then
515 | ||| starts the fold with the element following it.
516 | |||
517 | ||| ```idris example
518 | ||| scanl1 (-) (fromList [1,2,3])
519 | ||| ```
525 | --------------------------------------------------------------------------------
526 | -- Membership tests
527 | --------------------------------------------------------------------------------
529 | ||| Find the association of some key with a user-provided comparison
530 | ||| @ p the comparison operator for keys (True if they match)
531 | ||| @ e the key to look for
532 | |||
533 | ||| ```idris example
534 | ||| lookupBy (==) 2 [(1, 'a'), (2, 'b'), (3, 'c')]
535 | ||| ```
541 | ||| Find the association of some key using the default Boolean equality test
542 | |||
543 | ||| ```idris example
544 | ||| lookup 3 [(1, 'a'), (2, 'b'), (3, 'c')]
545 | ||| ```
550 | ||| Check if any element of xs is found in elems by a user-provided comparison
551 | ||| @ p the comparison operator
552 | ||| @ elems the vector to search
553 | ||| @ xs what to search for
554 | |||
555 | ||| ```idris example
556 | ||| hasAnyBy (==) [2,5] [1,2,3,4]
557 | ||| ```
559 | hasAnyBy : (p : elem -> elem -> Bool) -> (elems : Vect m elem) -> (xs : Vect len elem) -> Bool
563 | ||| Check if any element of xs is found in elems using the default Boolean equality test
564 | |||
565 | ||| ```idris example
566 | ||| hasAny [2,5] [1,2,3,4]
567 | ||| ```
572 | --------------------------------------------------------------------------------
573 | -- Searching with a predicate
574 | --------------------------------------------------------------------------------
576 | ||| Find the first element of the vector that satisfies some test
577 | ||| @ p the test to satisfy
578 | |||
579 | ||| ```idris example
580 | ||| find (== 3) [1,2,3,4]
581 | ||| ```
587 | ||| Find the index of the first element of the vector that satisfies some test
588 | |||
589 | ||| ```idris example
590 | ||| findIndex (== 3) [1,2,3,4]
591 | ||| ```
597 | ||| Find the indices of all elements that satisfy some test
598 | |||
599 | ||| ```idris example
600 | ||| findIndices (< 3) [1,2,3,4]
601 | ||| ```
609 | ||| Find the index of the first element of the vector that satisfies some test
610 | |||
611 | ||| ```idris example
612 | ||| elemIndexBy (==) 3 [1,2,3,4]
613 | ||| ```
618 | ||| Find the index of the first element of the vector equal to the given one.
619 | |||
620 | ||| ```idris example
621 | ||| elemIndex 3 [1,2,3,4]
622 | ||| ```
627 | ||| Find the indices of all elements that satisfy some test
628 | |||
629 | ||| ```idris example
630 | ||| elemIndicesBy (<=) 3 [1,2,3,4]
631 | ||| ```
636 | ||| Find the indices of all elements equal to the given one
637 | |||
638 | ||| ```idris example
639 | ||| elemIndices 3 [1,2,3,4,3]
640 | ||| ```
645 | --------------------------------------------------------------------------------
646 | -- Filters
647 | --------------------------------------------------------------------------------
649 | ||| Find all elements of a vector that satisfy some test
650 | |||
651 | ||| ```idris example
652 | ||| filter (< 3) (fromList [1,2,3,4])
653 | ||| ```
661 | else
672 | ||| Make the elements of some vector unique by some test
673 | |||
674 | ||| ```idris example
675 | ||| nubBy (==) (fromList [1,2,2,3,4,4])
676 | ||| ```
681 | ||| Make the elements of some vector unique by the default Boolean equality
682 | |||
683 | ||| ```idris example
684 | ||| nub (fromList [1,2,2,3,4,4])
685 | ||| ```
690 | ||| Delete first element from list according to some test
691 | |||
692 | ||| ```idris example
693 | ||| deleteBy (<) 3 (fromList [1,2,2,3,4,4])
694 | ||| ```
703 | ||| Delete first element from list equal to the given one
704 | |||
705 | ||| ```idris example
706 | ||| delete 2 (fromList [1,2,2,3,4,4])
707 | ||| ```
713 | --------------------------------------------------------------------------------
714 | -- Splitting and breaking vects
715 | --------------------------------------------------------------------------------
717 | ||| A tuple where the first element is a `Vect` of the `n` first elements and
718 | ||| the second element is a `Vect` of the remaining elements of the original.
719 | ||| It is equivalent to `(take n xs, drop n xs)` (`splitAtTakeDrop`),
720 | ||| but is more efficient.
721 | |||
722 | ||| @ n the index to split at
723 | ||| @ xs the `Vect` to split in two
724 | |||
725 | ||| ```idris example
726 | ||| splitAt 2 (fromList [1,2,3,4])
727 | ||| ```
734 | ||| A tuple where the first element is a `Vect` of the `n` elements passing given test
735 | ||| and the second element is a `Vect` of the remaining elements of the original.
736 | |||
737 | ||| ```idris example
738 | ||| partition (== 2) (fromList [1,2,3,2,4])
739 | ||| ```
747 | else
750 | ||| Split a vector whose length is a multiple of two numbers, k times n, into k
751 | ||| sections of length n.
752 | |||
753 | ||| ```idris example
754 | ||| > kSplits 2 4 [1, 2, 3, 4, 5, 6, 7, 8]
755 | ||| [[1, 2, 3, 4], [5, 6, 7, 8]]
756 | ||| ```
763 | ||| Split a vector whose length is a multiple of two numbers, k times n, into n
764 | ||| sections of length k.
765 | |||
766 | ||| ```idris example
767 | ||| > nSplits 2 4 [1, 2, 3, 4, 5, 6, 7, 8]
768 | ||| [[1, 5], [2, 6], [3, 7], [4, 8]]
769 | ||| ```
772 | -- implemented via matrix transposition, so the definition is further down
774 | --------------------------------------------------------------------------------
775 | -- Predicates
776 | --------------------------------------------------------------------------------
778 | ||| Verify vector prefix
779 | |||
780 | ||| ```idris example
781 | ||| isPrefixOfBy (==) (fromList [1,2]) (fromList [1,2,3,4])
782 | ||| ```
789 | ||| Verify vector prefix
790 | |||
791 | ||| ```idris example
792 | ||| isPrefixOf (fromList [1,2]) (fromList [1,2,3,4])
793 | ||| ```
798 | ||| Verify vector suffix
799 | |||
800 | ||| ```idris example
801 | ||| isSuffixOfBy (==) (fromList [3,4]) (fromList [1,2,3,4])
802 | ||| ```
807 | ||| Verify vector suffix
808 | |||
809 | ||| ```idris example
810 | ||| isSuffixOf (fromList [3,4]) (fromList [1,2,3,4])
811 | ||| ```
816 | --------------------------------------------------------------------------------
817 | -- Conversions
818 | --------------------------------------------------------------------------------
820 | ||| Convert Maybe type into Vect
821 | |||
822 | ||| ```idris example
823 | ||| maybeToVect (Just 2)
824 | ||| ```
830 | ||| Convert first element of Vect (if exists) into Maybe.
831 | |||
832 | ||| ```idris example
833 | ||| vectToMaybe [2]
834 | ||| ```
840 | --------------------------------------------------------------------------------
841 | -- Misc
842 | --------------------------------------------------------------------------------
844 | ||| Filter out Nothings from Vect and unwrap the Justs
845 | |||
846 | ||| ```idris example
847 | ||| catMaybes [Just 1, Just 2, Nothing, Nothing, Just 5]
848 | ||| ```
857 | ||| Get diagonal elements
858 | |||
859 | ||| ```idris example
860 | ||| diag [[1,2,3], [4,5,6], [7,8,9]]
861 | ||| ```
891 | --------------------------------------------------------------------------------
892 | -- Zippable
893 | --------------------------------------------------------------------------------
913 | export
914 | zipWithIndexLinear : (0 f : _) -> (xs, ys : Vect n a) -> (i : Fin n) -> index i (zipWith f xs ys) = f (index i xs) (index i ys)
918 | export
919 | 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)
923 | --------------------------------------------------------------------------------
924 | -- Permutation
925 | --------------------------------------------------------------------------------
927 | ||| Rearrange the elements of a vector according to some permutation of its
928 | ||| indices.
929 | ||| @ v the vector whose elements to rearrange
930 | ||| @ p the permutation to apply
931 | |||
932 | ||| ```idris example
933 | ||| > permute ['a', 'b', 'c', 'd'] [0, 3, 2, 1]
934 | ||| ['a', 'd' , 'c' ,'b']
935 | ||| ```
936 | export
940 | --------------------------------------------------------------------------------
941 | -- Matrix transposition
942 | --------------------------------------------------------------------------------
944 | ||| Transpose a `Vect` of `Vect`s, turning rows into columns and vice versa.
945 | |||
946 | ||| This is like zipping all the inner `Vect`s together and is equivalent to `traverse id` (`transposeTraverse`).
947 | |||
948 | ||| As the types ensure rectangularity, this is an involution, unlike `Prelude.List.transpose`.
949 | |||
950 | ||| ```idris example
951 | ||| transpose [[1,2], [3,4], [5,6], [7,8]]
952 | ||| ```
958 | -- nSplits from earlier on
961 | --------------------------------------------------------------------------------
962 | -- Applicative/Monad/Traversable
963 | --------------------------------------------------------------------------------
964 | -- These only work if the length is known at run time!
971 | -- ||| This monad is different from the List monad, (>>=)
972 | -- ||| uses the diagonal.
982 | --------------------------------------------------------------------------------
983 | -- Semigroup/Monoid
984 | --------------------------------------------------------------------------------
994 | --------------------------------------------------------------------------------
995 | -- Show
996 | --------------------------------------------------------------------------------
998 | export
1002 | -- Some convenience functions for testing lengths
1004 | -- Needs to be Maybe rather than Dec, because if 'n' is unequal to m, we
1005 | -- only know we don't know how to make a Vect n a, not that one can't exist.
1006 | export
1013 | ||| If the given Vect is at least the required length, return a Vect with
1014 | ||| at least that length in its type, otherwise return Nothing
1015 | ||| @len the required length
1016 | ||| @xs the vector with the desired length
1017 | export