0 | module Data.Array.Mutable
2 | import public Data.Linear.Token
3 | import public Data.Array.Core
4 | import public Data.Array.Index
19 | (r : MArray s (length ys) a)
20 | -> Suffix (x::xs) ys
23 | setAtSuffix r v = set r (suffixToFin v)
25 | parameters (r : MArray s n a)
34 | setIx : (0 m : Nat) -> (x : Ix (S m) n) => a -> F1' s
35 | setIx _ = set r (ixToFin x)
39 | setNat : (m : Nat) -> (0 lt : LT m n) => a -> F1' s
40 | setNat x = set r (natToFinLT x)
49 | getIx : (0 m : Nat) -> (x : Ix (S m) n) => F1 s a
50 | getIx _ = get r (ixToFin x)
54 | getNat : (m : Nat) -> (0 lt : LT m n) => F1 s a
55 | getNat x = get r (natToFinLT x)
64 | modifyIx : (0 m : Nat) -> (x : Ix (S m) n) => (a -> a) -> F1' s
65 | modifyIx _ = modify r (ixToFin x)
69 | modifyNat : (m : Nat) -> (0 lt : LT m n) => (a -> a) -> F1' s
70 | modifyNat m = modify r (natToFinLT m)
81 | (r : MArray s (length xs) a)
83 | -> {auto p : Suffix ys xs}
85 | writeList r [] t = () # t
86 | writeList r (y :: ys) t =
87 | let _ # t := setAtSuffix r p y t
88 | in writeList {xs} r ys t
95 | (r : MArray s (length xs) b)
98 | -> {auto p : Suffix ys xs}
100 | writeListWith r [] f t = () # t
101 | writeListWith r (y :: ys) f t =
102 | let _ # t := setAtSuffix r p (f y) t
103 | in writeListWith {xs} r ys f t
105 | parameters (r : MArray s n a)
109 | writeVect : Vect k a -> Ix k n => F1' s
110 | writeVect [] t = () # t
111 | writeVect {k = S m} (y :: ys) t =
112 | let _ # t := setIx r m y t
117 | writeVectRev : (m : Nat) -> Vect k a -> (0 _ : LTE m n) => F1' s
118 | writeVectRev (S l) (y :: ys) t =
119 | let _ # t := setNat r l y t
120 | in writeVectRev l ys t
121 | writeVectRev _ _ t = () # t
126 | genFrom : (m : Nat) -> (0 _ : LTE m n) => (Fin n -> a) -> F1' s
127 | genFrom 0 f t = () # t
128 | genFrom (S k) f t =
129 | let _ # t := setNat r k (f $
natToFinLT k) t
135 | genFrom' : (m : Nat) -> (0 _ : LTE m n) => (Fin n -> F1 s a) -> F1' s
136 | genFrom' 0 f t = () # t
137 | genFrom' (S k) f t =
138 | let f' # t := f (natToFinLT k) t
139 | _ # t := setNat r k f' t
146 | iterateFrom : (m : Nat) -> (ix : Ix m n) => (a -> a) -> a -> F1' s
147 | iterateFrom 0 f v t = () # t
148 | iterateFrom (S k) f v t =
149 | let _ # t := setIx r k v t
150 | in iterateFrom k f (f v) t
153 | allocList : (xs : List a) -> WithMArray (length xs) a b -> b
155 | unsafeAlloc (length xs) $
\r,t =>
156 | let _ # t := writeList {xs} r xs t
160 | allocListWith : (xs : List a) -> (a -> b) -> WithMArray (length xs) b c -> c
161 | allocListWith xs f g =
162 | unsafeAlloc (length xs) $
\r,t =>
163 | let _ # t := writeListWith {xs} r xs f t
167 | allocVect : {n : _} -> Vect n a -> WithMArray n a b -> b
169 | unsafeAlloc n $
\r,t =>
170 | let _ # t := writeVect r xs t
174 | allocVectRev : {n : _} -> Vect n a -> WithMArray n a b -> b
175 | allocVectRev xs g =
176 | unsafeAlloc n $
\r,t =>
177 | let _ # t := writeVectRev r n xs t
181 | allocGen : (n : Nat) -> (Fin n -> a) -> WithMArray n a b -> b
183 | unsafeAlloc n $
\r,t =>
184 | let _ # t := genFrom r n f t
188 | allocIter : (n : Nat) -> (a -> a) -> a -> WithMArray n a b -> b
189 | allocIter n f v g =
190 | unsafeAlloc n $
\r,t =>
191 | let _ # t := iterateFrom r n f v t
198 | parameters {n : Nat}
204 | mgrow : (m : Nat) -> (deflt : a) -> F1 s (MArray s (m+n) a)
206 | let tgt # t := marray1 (m+n) deflt t
207 | _ # t := copy r 0 0 n @{reflexive} @{lteAddLeft n} tgt t
214 | parameters {m, n : Nat}
221 | mappend : F1 s (MArray s (m+n) a)
223 | let tgt # t := unsafeMArray1 (m+n) t
224 | _ # t := copy p 0 0 m @{reflexive} @{lteAddRight m} tgt t
225 | _ # t := copy q 0 m n @{reflexive} tgt t
232 | 0 curLTE : (s : Ix m n) -> LTE c (ixToNat s) -> LTE c n
233 | curLTE s lte = transitive lte $
ixLTE s
235 | 0 curLT : (s : Ix (S m) n) -> LTE c (ixToNat s) -> LT c n
236 | curLT s lte = let LTESucc p := ixLT s in LTESucc $
transitive lte p
238 | parameters {n : Nat}
243 | mfilterWithKey : (Fin n -> a -> Bool) -> F1 s (
m ** MArray s m a)
244 | mfilterWithKey f t =
245 | let tft # t := unsafeMArray1 n t
249 | -> (q : MArray s n a)
250 | -> {auto v : Ix x n}
251 | -> {auto 0 prf : LTE m $
ixToNat v}
252 | -> F1 s (
m ** MArray s m a)
254 | let q' # t := mtake q m @{curLTE v prf} t
257 | let j' # t := getIx p j t
258 | in case f (ixToFin v) j' of
260 | let () # t := setNat q m @{curLT v prf} j' t
262 | False => go m j q t
266 | mfilter : (a -> Bool) -> F1 s (
m ** MArray s m a)
267 | mfilter = mfilterWithKey . const
271 | mmapMaybeWithKey : (Fin n -> a -> Maybe b) -> F1 s (
m ** MArray s m b)
272 | mmapMaybeWithKey f t =
273 | let tft # t := unsafeMArray1 n t
277 | -> (q : MArray s n b)
278 | -> {auto v : Ix x n}
279 | -> {auto 0 prf : LTE m $
ixToNat v}
280 | -> F1 s (
m ** MArray s m b)
282 | let q' # t := mtake q m @{curLTE v prf} t
285 | let j' # t := getIx p j t
286 | in case f (ixToFin v) j' of
288 | let () # t := setNat q m @{curLT v prf} y t
290 | Nothing => go m j q t
292 | parameters {n : Nat}
298 | mdrop : F1 s (MArray s (n `minus` m) a)
300 | let tdt # t := unsafeMArray1 (n `minus` m) t
301 | _ # t := copy r (n `minus` (n `minus` m)) 0 (n `minus` m) @{dropLemma m n} tdt t
312 | mupdate1 : {n : _} -> (f : a -> F1 s a) -> MArray s n a -> F1' s
313 | mupdate1 f r = go n
315 | go : (k: Nat) -> (x : Ix k n) => F1' s
318 | let v # t := getIx r k t
320 | _ # t := setIx r k v2 t
327 | mupdate : {n : _} -> (f : a -> a) -> MArray s n a -> F1' s
330 | go : (k: Nat) -> (0 lt : LTE k n) => F1' s
333 | let v # t := getNat r k t
334 | _ # t := setNat r k (f v) t
339 | mmap1 : {n : _} -> (f : a -> F1 s b) -> MArray s n a -> F1 s (MArray s n b)
341 | let tmt # t := unsafeMArray1 n t
342 | _ # t := genFrom' tmt n go t
345 | go : Fin n -> F1 s b
346 | go x t = let x' # t := get r x t in f x' t
350 | mmap : {n : _} -> (f : a -> b) -> MArray s n a -> F1 s (MArray s n b)
351 | mmap f = mmap1 (\x,t => f x # t)
357 | parameters {k : Nat}
362 | mreverse : F1 s (MArray s k a)
364 | let trt # t := unsafeMArray1 k t
368 | -> (q : MArray s k a)
369 | -> {auto v : Ix x k}
370 | -> {auto 0 _ : LTE x k}
371 | -> F1 s (MArray s k a)
375 | let j' # t := getIx r j t
376 | () # t := setNat q j j' t
385 | foldrLin : (a -> b -> b) -> b -> F1 s b
388 | go : (n : Nat) -> (0 lt : LTE n k) => b -> F1 s b
391 | let el # t := getNat r k t
396 | toVect : F1 s (Vect k a)
399 | go : Vect m a -> (n : Nat) -> (0 lt : LTE n k) => F1 s (Vect (m+n) a)
400 | go vs 0 t = rewrite plusCommutative m 0 in vs # t
402 | let v # t := getNat r x t
403 | in rewrite sym (plusSuccRightSucc m x) in go (v::vs) x t
408 | toVectWith : (Fin k -> a -> b) -> F1 s (Vect k b)
409 | toVectWith f = go [] k
411 | go : Vect m b -> (n : Nat) -> (0 lt : LTE n k) => F1 s (Vect (m+n) b)
412 | go vs 0 t = rewrite plusCommutative m 0 in vs # t
414 | let v # t := getNat r x t
415 | vb := f (natToFinLT x) v
416 | in rewrite sym (plusSuccRightSucc m x) in go (vb::vs) x t