0 | module Data.Buffer.Mutable
2 | import public Data.Array.Index
3 | import public Data.Buffer.Core
4 | import public Data.Linear.Token
19 | setAtSuffix : MBuffer s (length ys) -> Suffix (x::xs) ys -> Bits8 -> F1' s
20 | setAtSuffix r v = set r (suffixToFin v)
24 | setBits8 : MBuffer s 256 -> Bits8 -> Bits8 -> F1' s
25 | setBits8 r x = set r (bits8ToFin x)
29 | getBits8 : MBuffer s 256 -> Bits8 -> F1 s Bits8
30 | getBits8 r x = get r (bits8ToFin x)
32 | parameters (r : MBuffer s n)
41 | setIx : (0 m : Nat) -> (x : Ix (S m) n) => Bits8 -> F1' s
42 | setIx _ = set r (ixToFin x)
46 | setNat : (m : Nat) -> (0 lt : LT m n) => Bits8 -> F1' s
47 | setNat x = set r (natToFinLT x)
56 | getIx : (0 m : Nat) -> (x : Ix (S m) n) => F1 s Bits8
57 | getIx _ = get r (ixToFin x)
66 | getNat : (m : Nat) -> (0 lt : LT m n) => F1 s Bits8
67 | getNat x = get r (natToFinLT x)
76 | modifyIx : (0 m : Nat) -> (x : Ix (S m) n) => (Bits8 -> Bits8) -> F1' s
77 | modifyIx _ = modify r (ixToFin x)
81 | modifyNat : (m : Nat) -> (0 lt : LT m n) => (Bits8 -> Bits8) -> F1' s
82 | modifyNat m = modify r (natToFinLT m)
91 | MBuffer s (length xs)
92 | -> (ys : List Bits8)
93 | -> {auto p : Suffix ys xs}
95 | writeList r [] t = () # t
96 | writeList r (y :: ys) t =
97 | let _ # t := setAtSuffix r p y t
98 | in writeList {xs} r ys t
100 | parameters (r : MBuffer s n)
104 | writeVect : Vect k Bits8 -> Ix k n => F1' s
105 | writeVect [] t = () # t
106 | writeVect {k = S m} (y :: ys) t =
107 | let _ # t := setIx r m y t
112 | writeVectRev : (m : Nat) -> Vect k Bits8 -> (0 _ : LTE m n) => F1' s
113 | writeVectRev (S l) (y :: ys) t =
114 | let _ # t := setNat r l y t
115 | in writeVectRev l ys t
116 | writeVectRev _ _ t = () # t
121 | genFrom : (m : Nat) -> (0 _ : LTE m n) => (Fin n -> Bits8) -> F1' s
122 | genFrom 0 f t = () # t
123 | genFrom (S k) f t =
124 | let _ # t := setNat r k (f $
natToFinLT k) t
130 | genFrom' : (m : Nat) -> (0 _ : LTE m n) => (Fin n -> F1 s Bits8) -> F1' s
131 | genFrom' 0 f t = () # t
132 | genFrom' (S k) f t =
133 | let f' # t := f (natToFinLT k) t
134 | _ # t := setNat r k f' t
141 | iterateFrom : (m : Nat) -> (ix : Ix m n) => (Bits8 -> Bits8) -> Bits8 -> F1' s
142 | iterateFrom 0 f v t = () # t
143 | iterateFrom (S k) f v t =
144 | let _ # t := setIx r k v t
145 | in iterateFrom k f (f v) t
151 | parameters {n : Nat}
156 | mgrow : (m : Nat) -> F1 s (MBuffer s (m+n))
158 | let tgt # t := mbuffer1 (m+n) t
159 | _ # t := copy r 0 0 n @{reflexive} @{lteAddLeft n} tgt t
166 | parameters {m, n : Nat}
173 | mappend : F1 s (MBuffer s (m+n))
175 | let tgt # t := mbuffer1 (m+n) t
176 | _ # t := copy p 0 0 m @{reflexive} @{lteAddRight m} tgt t
177 | _ # t := copy q 0 m n @{reflexive} tgt t
184 | 0 curLTE : (s : Ix m n) -> LTE c (ixToNat s) -> LTE c n
185 | curLTE s lte = transitive lte $
ixLTE s
187 | 0 curLT : (s : Ix (S m) n) -> LTE c (ixToNat s) -> LT c n
188 | curLT s lte = let LTESucc p := ixLT s in LTESucc $
transitive lte p
190 | parameters {n : Nat}
191 | (f : Bits8 -> Bool)
196 | mfilter : F1 s (
m ** MBuffer s m)
198 | let tft # t := mbuffer1 n t
202 | -> (q : MBuffer s n)
203 | -> {auto v : Ix x n}
204 | -> {auto 0 prf : LTE m $
ixToNat v}
205 | -> F1 s (
m ** MBuffer s m)
207 | let q' # t := mtake q m @{curLTE v prf} t
210 | let j' # t := getIx p j t
213 | let () # t := setNat q m @{curLT v prf} j' t
218 | parameters {n : Nat}
224 | mdrop : F1 s (MBuffer s (n `minus` m))
226 | let tdt # t := mbuffer1 (n `minus` m) t
227 | _ # t := copy r (n `minus` (n `minus` m)) 0 (n `minus` m) @{dropLemma m n} tdt t
237 | -> (f : Bits8 -> F1 s Bits8)
238 | -> (r : MBuffer s n)
239 | -> F1 s (MBuffer s n)
241 | let tmt # t := mbuffer1 n t
242 | _ # t := genFrom' tmt n go t
248 | let x' # t := get r x t
255 | -> (f : Bits8 -> Bits8)
256 | -> (r : MBuffer s n)
257 | -> F1 s (MBuffer s n)
258 | mmap f r t = mmap1 (\x => pure (f x)) r t
264 | parameters {n : Nat}
269 | mreverse : F1 s (MBuffer s n)
271 | let trt # t := mbuffer1 n t
275 | -> (q : MBuffer s n)
276 | -> {auto v : Ix x n}
277 | -> {auto 0 _ : LTE x n}
278 | -> F1 s (MBuffer s n)
282 | let j' # t := getIx p j t
283 | () # t := setNat q j j' t