0 | module Data.Compress.Utils.FiniteBuffer
2 | import Data.Seq.Unsized
5 | record FiniteBuffer a where
12 | empty : Nat -> FiniteBuffer a
13 | empty n = FB (cast n) 0 empty
16 | take_last : Nat -> FiniteBuffer a -> Maybe (List a)
17 | take_last n fb = guard (cast n <= fb.size) $> (toList $
take n $
drop (cast (fb.size - cast n)) fb.buffer)
20 | export infixr 5 +<><
23 | (+<) : FiniteBuffer a -> a -> FiniteBuffer a
24 | (FB max_size size buffer) +< x =
29 | if len > max_size then FB max_size max_size $
tail buf else FB max_size len buf
32 | (+<><) : Foldable f => FiniteBuffer a -> f a -> FiniteBuffer a
33 | buf +<>< elems = foldl (+<) buf elems
36 | length : FiniteBuffer a -> Nat
37 | length = cast . size