3{-| A library for manipulating arrays of elements. The elements in an
4array must have the same type. The arrays are implemented in Relaxed
5Radix Balanced-Trees for fast updating and concating.
7If you use more then one map or zip function on an array, consider turning it
8first into a list, operating on it, and then turning it back into an array.
11@docs empty, length, get, safeGet, getWithDefault
13# Putting Arrays Together
14@docs fill, fromList, concat, set, updates, push
17@docs elements, indices, assocs, slice
19# Mapping, folding, zipping
20@docs map, assocMap, foldl, foldr, zip, zipWith
30{-| Fills an array with a given length and a default element.
32 fill 3 5 == fromList [5,5,5]
34fill : Int -> a -> Array a
35fill len e = fromList <| List.map (always e) [1..len]
37{-| Create an array from a list. -}
38fromList : [a] -> Array a
39fromList = List.foldl (Native.Array.push) Native.Array.empty
41{-| Create a list of elements from an array.
43 elements (fromList [3,5,8]) == [3,5,8]
45elements : Array a -> [a]
46elements = Native.Array.toList
48{-| Create a list of the possible indices of an array.
50 indices (fromList [3,5,8] == [0,1,2])
52indices : Array a -> [Int]
53indices a = [0..Native.Array.length a - 1]
55{-| Create a list of tuples (Index, Element) from an array.
57 assocs (fromList [3,5,8]) == [(0,3), (1,5), (2,8)]
59assocs : Array a -> [(Int, a)]
60assocs a = List.zip (indices a) (Native.Array.elements a)
62{-| Apply a function on every element in an array.
64 map (\x -> x*x) (fromList [1,2,3]) == fromList [1,4,9]
66map : (a -> b) -> Array a -> Array b
69{-| Apply a function with an index on every element in an array.
71 assocMap (*) (fromList [5,5,5]) == fromList [0,5,10]
73assocMap : (Int -> a -> b) -> Array a -> Array b
74assocMap = Native.Array.assocMap
76{-| Reduce an array from the left.
78 foldl (+) 0 (fill 3 5) == 15
80foldl : (a -> b -> b) -> b -> Array a -> b
81foldl = Native.Array.foldl
83{-| Reduce an array from the right.
85 foldr (::) [] (fromList [1,2,3]) == [3,2,1]
87foldr : (a -> b -> b) -> b -> Array a -> b
88foldr = Native.Array.foldr
90{-| Zip the elements of two arrays via a tuple into a new array. If one array is
91longer, the extra elements are dropped.
93 zip (fromList [1,2,3,4]) (fromList [0,0,0]) = fromList [(1,0), (2,0), (3,0)]
95zip : Array a -> Array b -> Array (a,b)
98{-| Zips the elements of two arrays via a function into a new array. If one array
99is longer, the extra elements are dropped.
101 zipWith (+) (fill 3 5) (fill 5 8) == fill 3 13
103zipWith : (a -> b -> c) -> Array a -> Array b -> Array c
105 fromList <| List.zipWith f (Native.Array.elements a) (Native.Array.elements b)
107{-| Return an empty array.
112empty = Native.Array.empty
114{-| Push an item to the end of an array. -}
115push : a -> Array a -> Array a
116push = Native.Array.push
118{-| Return the value at the index. Breaks, if index is out of range. If the
119array length is unkown, use safeGet oder getWithDefault.
121 get 2 (A.fromList [3,2,1]) == 1
123get : Int -> Array a -> a
124get = Native.Array.get
126{-| Return Just the element at the index or Nothing.
128 safeGet 2 (A.fromList [3,2,1]) == Just 2
129 safeGet 5 (A.fromList [3,2,1]) == Nothing
131safeGet : Int -> Array a -> Maybe a
132safeGet i array = if Native.Array.length array > i
133 then Just (Native.Array.get i array)
136{-| Get the element at the index. If the index is out of range, the given default
139 getWithDefault 0 2 (A.fromList [3,2,1]) == 1
140 getWithDefault 0 5 (A.fromList [3,2,1]) == 0
142getWithDefault : a -> Int -> Array a -> a
143getWithDefault default i array = if Native.Array.length array > i
144 then Native.Array.get i array else default
146{-| Set the element at the index. Returns the updated array, or if the index is
147out of range, the unaltered array.
149 set 1 7 (fromList [1,2,3]) == fromList [1,7,3]
151set : Int -> a -> Array a -> Array a
152set = Native.Array.set
154{-| Update an array with a a list tuples, wherein the first Int is the index.
156 updates [(1,7),(2,8)] (fill 3 1) == fromList [1,7,8]
158updates : [(Int, a)] -> Array a -> Array a
159updates assocs array = List.foldl (uncurry Native.Array.set) array assocs
161{-| Slice an array given a range. The selection is inclusive, so the last
162element in the selection will also be in the new array. This may change in the
164You can select from the end by giving a negative Int.
166 slice 1 2 (fromList [0,1,2,3,4]) == fromList [1,2]
167 slice 1 -2 (fromList [0,1,2,3,4]) == fromList [1,2,3]
168 slice -3 -2 (fromList [0,1,2,3,4]) == fromList [2,3]
170slice : Int -> Int -> Array a -> Array a
171slice = Native.Array.slice
173{-| Return the length of an array.
175 length (fromList [1,2,3]) == 3
177length : Array a -> Int
178length = Native.Array.length
180{-| Concat two arrays to a new one.
182 concat (fill 3 1) (fill 4 2) == fromList [1,1,1,2,2,2,2]
184concat : Array a -> Array a -> Array a
185concat = Native.Array.concat
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list