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
18 | err s = assert_total (idris_crash s)
22 | data Seq : Nat -> Type -> Type where
23 | MkSeq : FingerTree (Elem e) -> Seq n e
32 | singleton : e -> Seq 1 e
33 | singleton a = MkSeq (Single (MkElem a))
37 | replicate : (n : Nat) -> (a : e) -> Seq n e
38 | replicate n a = MkSeq (replicate' n a)
42 | length : {n : Nat} -> Seq n a -> Nat
47 | reverse : Seq n a -> Seq n a
48 | reverse (MkSeq tr) = MkSeq (reverseTree id tr)
50 | export infixr 5 `cons`
53 | cons : e -> Seq n e -> Seq (S n) e
54 | a `cons` MkSeq tr = MkSeq (MkElem a `consTree` tr)
56 | export infixl 5 `snoc`
59 | snoc : Seq n e -> e -> Seq (S n) e
60 | MkSeq tr `snoc` a = MkSeq (tr `snocTree` MkElem a)
64 | (++) : Seq m e -> Seq n e -> Seq (m + n) e
65 | MkSeq t1 ++ MkSeq t2 = MkSeq (addTree0 t1 t2)
69 | viewl : Seq (S n) a -> (a, Seq n a)
70 | viewl (MkSeq tr) = case viewLTree tr of
71 | Just (MkElem a, tr') => (a, MkSeq tr')
72 | Nothing => err "viewl"
76 | head : Seq (S n) a -> a
81 | tail : Seq (S n) a -> Seq n a
86 | viewr : Seq (S n) a -> (Seq n a, a)
87 | viewr (MkSeq tr) = case viewRTree tr of
88 | Just (tr', MkElem a) => (MkSeq tr', a)
89 | Nothing => err "viewr"
93 | init : Seq (S n) a -> Seq n a
98 | last : Seq (S n) a -> a
103 | fromVect : Vect n a -> Seq n a
104 | fromVect xs = MkSeq (foldr (\x, t => MkElem x `consTree` t) Empty xs)
108 | fromList : (xs : List a) -> Seq (length xs) a
109 | fromList xs = fromVect (Vect.fromList xs)
113 | toVect : {n :Nat} -> Seq n a -> Vect n a
114 | toVect _ {n = 0} = []
115 | toVect ft {n = S _} =
116 | let (x, ft') = viewl ft
121 | index : (i : Nat) -> (t : Seq n a) -> {auto ok : LT i n} -> a
122 | index i (MkSeq t) = let (_, MkElem a) = lookupTree i t in a
127 | index' : (t : Seq n a) -> (i : Fin n) -> a
128 | index' (MkSeq t) fn = let (_, MkElem a) = lookupTree (finToNat fn) t in a
132 | adjust : (f : a -> a) -> (i : Nat) -> (t : Seq n a) -> {auto ok : LT i n} -> Seq n a
133 | adjust f i (MkSeq t) = MkSeq $
adjustTree (const (map f)) i t
137 | update : (i : Nat) -> a -> (t : Seq n a) -> {auto ok : LT i n} -> Seq n a
138 | update i a t = adjust (const a) i t
142 | splitAt : (i : Nat) -> Seq (i + j) a -> (Seq i a, Seq j a)
143 | splitAt i (MkSeq xs) =
144 | let (l, r) = split i xs
145 | in (MkSeq l, MkSeq r)
149 | take : (i : Nat) -> Seq (i + j) a -> Seq i a
150 | take i seq = fst (splitAt i seq)
154 | drop : (i : Nat) -> Seq (i + j) a -> Seq j a
155 | drop i seq = snd (splitAt i seq)
159 | show' : Show a => Seq n a -> String
160 | show' (MkSeq tr) = showPrec Open tr
163 | implementation Eq a => Eq (Seq n a) where
164 | MkSeq x == MkSeq y = x == y
167 | implementation Ord a => Ord (Seq n a) where
168 | compare (MkSeq x) (MkSeq y) = compare x y
171 | implementation Functor (Seq n) where
172 | map f (MkSeq tr) = MkSeq (map (map f) tr)
175 | implementation Foldable (Seq n) where
176 | foldr f z (MkSeq tr) = foldr (f . unElem) z tr
178 | foldl f z (MkSeq tr) = foldl (\acc, (MkElem elem) => f acc elem) z tr
180 | toList (MkSeq tr) = toList' tr
182 | null (MkSeq Empty) = True
186 | implementation Traversable (Seq n) where
187 | traverse f (MkSeq tr) = MkSeq <$> traverse (map MkElem . f . unElem) tr
190 | implementation Show a => Show (Seq n a) where
191 | showPrec p = showPrec p . toList
194 | implementation Zippable (Seq n) where
195 | zipWith f (MkSeq x) (MkSeq y) = MkSeq (zipWith' f x y)
197 | zipWith3 f (MkSeq x) (MkSeq y) (MkSeq z) = MkSeq (zipWith3' f x y z)
199 | unzipWith f (MkSeq zs) = let (xs, ys) = unzipWith' f zs in (MkSeq xs, MkSeq ys)
201 | unzipWith3 f (MkSeq ws) = let (xs, ys, zs) = unzipWith3' f ws in (MkSeq xs, MkSeq ys, MkSeq zs)
206 | implementation {n : Nat} -> Applicative (Seq n) where
208 | (<*>) = zipWith ($)
211 | implementation Sized (Seq n a) where
212 | size (MkSeq s) = size s