4 | module Data.Seq.Sized
6 | import Control.WellFounded
8 | import public Data.Fin
9 | import public Data.Nat
10 | import public Data.Vect
11 | import public Data.Zippable
13 | import Data.Seq.Internal
19 | err s = assert_total (idris_crash s)
23 | data Seq : Nat -> Type -> Type where
24 | MkSeq : FingerTree (Elem e)
38 | MkSeq (Single (MkElem a))
42 | replicate : (n : Nat)
46 | MkSeq (replicate' n a)
60 | reverse (MkSeq tr) =
61 | MkSeq (reverseTree id tr)
63 | export infixr 5 `cons`
70 | MkSeq (MkElem a `consTree` tr)
72 | export infixl 5 `snoc`
79 | MkSeq (tr `snocTree` MkElem a)
86 | MkSeq t1 ++ MkSeq t2 =
87 | MkSeq (addTree0 t1 t2)
94 | case viewLTree tr of
95 | Just (MkElem a, tr') =>
116 | viewr : Seq (S n) a
119 | case viewRTree tr of
120 | Just (tr', MkElem a) =>
141 | fromVect : Vect n a
144 | MkSeq (foldr (\x, t => MkElem x `consTree` t) Empty xs)
148 | fromList : (xs : List a)
149 | -> Seq (length xs) a
151 | fromVect (Vect.fromList xs)
160 | toVect ft {n = S _} =
161 | let (x, ft') = viewl ft
168 | -> {auto ok : LT i n}
170 | index i (MkSeq t) =
171 | let (_, MkElem a) = lookupTree i t
177 | index' : (t : Seq n a)
180 | index' (MkSeq t) fn =
181 | let (_, MkElem a) = lookupTree (finToNat fn) t
186 | adjust : (f : a -> a)
189 | -> {auto ok : LT i n}
191 | adjust f i (MkSeq t) =
192 | MkSeq $
adjustTree (const (map f)) i t
199 | -> {auto ok : LT i n}
202 | adjust (const a) i t
206 | splitAt : (i : Nat)
208 | -> (Seq i a, Seq j a)
209 | splitAt i (MkSeq xs) =
210 | let (l, r) = split i xs
211 | in (MkSeq l, MkSeq r)
219 | fst (splitAt i seq)
227 | snd (splitAt i seq)
238 | implementation Eq a => Eq (Seq n a) where
239 | MkSeq x == MkSeq y = x == y
242 | implementation Ord a => Ord (Seq n a) where
243 | compare (MkSeq x) (MkSeq y) = compare x y
246 | implementation Functor (Seq n) where
247 | map f (MkSeq tr) = MkSeq (map (map f) tr)
250 | implementation Foldable (Seq n) where
251 | foldr f z (MkSeq tr) = foldr (f . unElem) z tr
252 | foldl f z (MkSeq tr) = foldl (\acc, (MkElem elem) => f acc elem) z tr
253 | toList (MkSeq tr) = toList' tr
254 | null (MkSeq Empty) = True
258 | implementation Traversable (Seq n) where
259 | traverse f (MkSeq tr) = MkSeq <$> traverse (map MkElem . f . unElem) tr
262 | implementation Show a => Show (Seq n a) where
263 | showPrec p = showPrec p . toList
266 | implementation Zippable (Seq n) where
267 | zipWith f (MkSeq x) (MkSeq y) = MkSeq (zipWith' f x y)
268 | zipWith3 f (MkSeq x) (MkSeq y) (MkSeq z) = MkSeq (zipWith3' f x y z)
269 | unzipWith f (MkSeq zs) = let (xs, ys) = unzipWith' f zs in (MkSeq xs, MkSeq ys)
270 | unzipWith3 f (MkSeq ws) = let (xs, ys, zs) = unzipWith3' f ws in (MkSeq xs, MkSeq ys, MkSeq zs)
275 | implementation {n : Nat} -> Applicative (Seq n) where
277 | (<*>) = zipWith ($)
280 | implementation Sized (Seq n a) where
281 | size (MkSeq s) = size s