0 | module Data.Array.Mutable
2 | import public Data.Linear.Token
3 | import public Data.Array.Core
4 | import public Data.Array.Index
6 | import Data.Linear.Traverse1
21 | (r : MArray s (length ys) a)
22 | -> Suffix (x::xs) ys
25 | setAtSuffix r v = set r (suffixToFin v)
27 | parameters (r : MArray s n a)
36 | setIx : (0 m : Nat) -> (x : Ix (S m) n) => a -> F1' s
37 | setIx _ = set r (ixToFin x)
41 | setNat : (m : Nat) -> (0 lt : LT m n) => a -> F1' s
42 | setNat x = set r (natToFinLT x)
51 | getIx : (0 m : Nat) -> (x : Ix (S m) n) => F1 s a
52 | getIx _ = get r (ixToFin x)
56 | getNat : (m : Nat) -> (0 lt : LT m n) => F1 s a
57 | getNat x = get r (natToFinLT x)
66 | modifyIx : (0 m : Nat) -> (x : Ix (S m) n) => (a -> a) -> F1' s
67 | modifyIx _ = modify r (ixToFin x)
71 | modifyNat : (m : Nat) -> (0 lt : LT m n) => (a -> a) -> F1' s
72 | modifyNat m = modify r (natToFinLT m)
83 | (r : MArray s (length xs) a)
85 | -> {auto p : Suffix ys xs}
87 | writeList r [] t = () # t
88 | writeList r (y :: ys) t =
89 | let _ # t := setAtSuffix r p y t
90 | in writeList {xs} r ys t
97 | (r : MArray s (length xs) b)
100 | -> {auto p : Suffix ys xs}
102 | writeListWith r [] f t = () # t
103 | writeListWith r (y :: ys) f t =
104 | let _ # t := setAtSuffix r p (f y) t
105 | in writeListWith {xs} r ys f t
107 | parameters (r : MArray s n a)
111 | writeVect : Vect k a -> Ix k n => F1' s
112 | writeVect [] t = () # t
113 | writeVect {k = S m} (y :: ys) t =
114 | let _ # t := setIx r m y t
119 | writeVectRev : (m : Nat) -> Vect k a -> (0 _ : LTE m n) => F1' s
120 | writeVectRev (S l) (y :: ys) t =
121 | let _ # t := setNat r l y t
122 | in writeVectRev l ys t
123 | writeVectRev _ _ t = () # t
128 | genFrom : (m : Nat) -> (0 _ : LTE m n) => (Fin n -> a) -> F1' s
129 | genFrom 0 f t = () # t
130 | genFrom (S k) f t =
131 | let _ # t := setNat r k (f $
natToFinLT k) t
137 | genFrom' : (m : Nat) -> (0 _ : LTE m n) => (Fin n -> F1 s a) -> F1' s
138 | genFrom' 0 f t = () # t
139 | genFrom' (S k) f t =
140 | let f' # t := f (natToFinLT k) t
141 | _ # t := setNat r k f' t
148 | iterateFrom : (m : Nat) -> (ix : Ix m n) => (a -> a) -> a -> F1' s
149 | iterateFrom 0 f v t = () # t
150 | iterateFrom (S k) f v t =
151 | let _ # t := setIx r k v t
152 | in iterateFrom k f (f v) t
155 | allocList : (xs : List a) -> WithMArray (length xs) a b -> b
157 | unsafeAlloc (length xs) $
\r,t =>
158 | let _ # t := writeList {xs} r xs t
162 | allocListWith : (xs : List a) -> (a -> b) -> WithMArray (length xs) b c -> c
163 | allocListWith xs f g =
164 | unsafeAlloc (length xs) $
\r,t =>
165 | let _ # t := writeListWith {xs} r xs f t
169 | allocVect : {n : _} -> Vect n a -> WithMArray n a b -> b
171 | unsafeAlloc n $
\r,t =>
172 | let _ # t := writeVect r xs t
176 | allocVectRev : {n : _} -> Vect n a -> WithMArray n a b -> b
177 | allocVectRev xs g =
178 | unsafeAlloc n $
\r,t =>
179 | let _ # t := writeVectRev r n xs t
183 | allocGen : (n : Nat) -> (Fin n -> a) -> WithMArray n a b -> b
185 | unsafeAlloc n $
\r,t =>
186 | let _ # t := genFrom r n f t
190 | allocIter : (n : Nat) -> (a -> a) -> a -> WithMArray n a b -> b
191 | allocIter n f v g =
192 | unsafeAlloc n $
\r,t =>
193 | let _ # t := iterateFrom r n f v t
200 | parameters {n : Nat}
206 | mgrow : (m : Nat) -> (deflt : a) -> F1 s (MArray s (m+n) a)
208 | let tgt # t := marray1 (m+n) deflt t
209 | _ # t := copy r 0 0 n @{reflexive} @{lteAddLeft n} tgt t
216 | parameters {m, n : Nat}
223 | mappend : F1 s (MArray s (m+n) a)
225 | let tgt # t := unsafeMArray1 (m+n) t
226 | _ # t := copy p 0 0 m @{reflexive} @{lteAddRight m} tgt t
227 | _ # t := copy q 0 m n @{reflexive} tgt t
234 | 0 curLTE : (s : Ix m n) -> LTE c (ixToNat s) -> LTE c n
235 | curLTE s lte = transitive lte $
ixLTE s
237 | 0 curLT : (s : Ix (S m) n) -> LTE c (ixToNat s) -> LT c n
238 | curLT s lte = let LTESucc p := ixLT s in LTESucc $
transitive lte p
240 | parameters {n : Nat}
245 | mfilterWithKey : (Fin n -> a -> Bool) -> F1 s (
m ** MArray s m a)
246 | mfilterWithKey f t =
247 | let tft # t := unsafeMArray1 n t
251 | -> (q : MArray s n a)
252 | -> {auto v : Ix x n}
253 | -> {auto 0 prf : LTE m $
ixToNat v}
254 | -> F1 s (
m ** MArray s m a)
256 | let q' # t := mtake q m @{curLTE v prf} t
259 | let j' # t := getIx p j t
260 | in case f (ixToFin v) j' of
262 | let () # t := setNat q m @{curLT v prf} j' t
264 | False => go m j q t
268 | mfilter : (a -> Bool) -> F1 s (
m ** MArray s m a)
269 | mfilter = mfilterWithKey . const
273 | mmapMaybeWithKey : (Fin n -> a -> Maybe b) -> F1 s (
m ** MArray s m b)
274 | mmapMaybeWithKey f t =
275 | let tft # t := unsafeMArray1 n t
279 | -> (q : MArray s n b)
280 | -> {auto v : Ix x n}
281 | -> {auto 0 prf : LTE m $
ixToNat v}
282 | -> F1 s (
m ** MArray s m b)
284 | let q' # t := mtake q m @{curLTE v prf} t
287 | let j' # t := getIx p j t
288 | in case f (ixToFin v) j' of
290 | let () # t := setNat q m @{curLT v prf} y t
292 | Nothing => go m j q t
294 | parameters {n : Nat}
300 | mdrop : F1 s (MArray s (n `minus` m) a)
302 | let tdt # t := unsafeMArray1 (n `minus` m) t
303 | _ # t := copy r (n `minus` (n `minus` m)) 0 (n `minus` m) @{dropLemma m n} tdt t
314 | mupdate1 : {n : _} -> (f : a -> F1 s a) -> MArray s n a -> F1' s
315 | mupdate1 f r = go n
317 | go : (k: Nat) -> (x : Ix k n) => F1' s
320 | let v # t := getIx r k t
322 | _ # t := setIx r k v2 t
329 | mupdate : {n : _} -> (f : a -> a) -> MArray s n a -> F1' s
332 | go : (k: Nat) -> (0 lt : LTE k n) => F1' s
335 | let v # t := getNat r k t
336 | _ # t := setNat r k (f v) t
341 | mmap1 : {n : _} -> (f : a -> F1 s b) -> MArray s n a -> F1 s (MArray s n b)
343 | let tmt # t := unsafeMArray1 n t
344 | _ # t := genFrom' tmt n go t
347 | go : Fin n -> F1 s b
348 | go x t = let x' # t := get r x t in f x' t
352 | mmap : {n : _} -> (f : a -> b) -> MArray s n a -> F1 s (MArray s n b)
353 | mmap f = mmap1 (\x,t => f x # t)
359 | parameters {k : Nat}
364 | mreverse : F1 s (MArray s k a)
366 | let trt # t := unsafeMArray1 k t
370 | -> (q : MArray s k a)
371 | -> {auto v : Ix x k}
372 | -> {auto 0 _ : LTE x k}
373 | -> F1 s (MArray s k a)
377 | let j' # t := getIx r j t
378 | () # t := setNat q j j' t
387 | foldrLin : (a -> b -> b) -> b -> F1 s b
390 | go : (n : Nat) -> (0 lt : LTE n k) => b -> F1 s b
393 | let el # t := getNat r k t
398 | toVect : F1 s (Vect k a)
401 | go : Vect m a -> (n : Nat) -> (0 lt : LTE n k) => F1 s (Vect (m+n) a)
402 | go vs 0 t = rewrite plusCommutative m 0 in vs # t
404 | let v # t := getNat r x t
405 | in rewrite sym (plusSuccRightSucc m x) in go (v::vs) x t
410 | toVectWith : (Fin k -> a -> b) -> F1 s (Vect k b)
411 | toVectWith f = go [] k
413 | go : Vect m b -> (n : Nat) -> (0 lt : LTE n k) => F1 s (Vect (m+n) b)
414 | go vs 0 t = rewrite plusCommutative m 0 in vs # t
416 | let v # t := getNat r x t
417 | vb := f (natToFinLT x) v
418 | in rewrite sym (plusSuccRightSucc m x) in go (vb::vs) x t
426 | 0 Matrix1 : Type -> (w,h : Nat) -> Type -> Type
427 | Matrix1 s w h a = MArray s w (MArray s h a)
430 | newM1 : (w, h : Nat) -> a -> F1 s (Matrix1 s w h a)
431 | newM1 w h v = T1.do
432 | m <- unsafeMArray1 {a = MArray s h a} w
433 | for1_ (allFinsFast w) $
\i => marray1 h v >>= set m i
437 | writeM1 : Matrix1 s w h a -> Fin w -> Fin h -> a -> F1' s
438 | writeM1 m x y v t = let r # t := get m x t in set r y v t
441 | readM1 : Matrix1 s w h a -> Fin w -> Fin h -> F1 s a
442 | readM1 m x y t = let r # t := get m x t in get r y t