3 | module Data.Seq.Unsized
5 | import Control.WellFounded
6 | import public Data.Zippable
8 | import Data.Seq.Internal
14 | data Seq : Type -> Type where
15 | MkSeq : FingerTree (Elem e) -> Seq e
24 | singleton : e -> Seq e
25 | singleton a = MkSeq (Single (MkElem a))
29 | replicate : (n : Nat) -> (a : e) -> Seq e
30 | replicate n a = MkSeq (replicate' n a)
34 | length : Seq a -> Nat
35 | length (MkSeq tr) = length' tr
39 | reverse : Seq a -> Seq a
40 | reverse (MkSeq tr) = MkSeq (reverseTree id tr)
42 | export infixr 5 `cons`
45 | cons : e -> Seq e -> Seq e
46 | a `cons` MkSeq tr = MkSeq (MkElem a `consTree` tr)
48 | export infixl 5 `snoc`
51 | snoc : Seq e -> e -> Seq e
52 | MkSeq tr `snoc` a = MkSeq (tr `snocTree` MkElem a)
56 | (++) : Seq e -> Seq e -> Seq e
57 | MkSeq t1 ++ MkSeq t2 = MkSeq (addTree0 t1 t2)
61 | viewl : Seq a -> Maybe (a, Seq a)
62 | viewl (MkSeq tr) = case viewLTree tr of
63 | Just (MkElem a, tr') => Just (a, MkSeq tr')
68 | head : Seq a -> Maybe a
69 | head s = fst <$> viewl s
74 | tail : Seq a -> Seq a
75 | tail s = case viewl s of
81 | viewr : Seq a -> Maybe (Seq a, a)
82 | viewr (MkSeq tr) = case viewRTree tr of
83 | Just (tr', MkElem a) => Just (MkSeq tr', a)
89 | init : Seq a -> Seq a
90 | init s = case viewr s of
96 | last : Seq a -> Maybe a
97 | last s = snd <$> viewr s
101 | fromList : List a -> Seq a
102 | fromList xs = MkSeq (foldr (\x, t => MkElem x `consTree` t) Empty xs)
106 | index : Nat -> Seq a -> Maybe a
107 | index i (MkSeq t) = if i < length' t
108 | then let (_, MkElem a) = lookupTree i t in Just a
114 | adjust : (a -> a) -> Nat -> Seq a -> Seq a
115 | adjust f i s@(MkSeq t) = if i < length' t
116 | then MkSeq $
adjustTree (const (map f)) i t
122 | update : Nat -> a -> Seq a -> Seq a
123 | update i a t = adjust (const a) i t
128 | splitAt : Nat -> Seq a -> (Seq a, Seq a)
129 | splitAt i s@(MkSeq t) = if i < length' t
130 | then let (l, r) = split i t
131 | in (MkSeq l, MkSeq r)
137 | take : Nat -> Seq a -> Seq a
138 | take i seq = fst (splitAt i seq)
143 | drop : Nat -> Seq a -> Seq a
144 | drop i seq = snd (splitAt i seq)
148 | show' : Show a => Seq a -> String
149 | show' (MkSeq tr) = showPrec Open tr
152 | implementation Eq a => Eq (Seq a) where
153 | MkSeq x == MkSeq y = x == y
156 | implementation Ord a => Ord (Seq a) where
157 | compare (MkSeq x) (MkSeq y) = compare x y
160 | implementation Functor Seq where
161 | map f (MkSeq tr) = MkSeq (map (map f) tr)
164 | implementation Foldable Seq where
165 | foldr f z (MkSeq tr) = foldr (f . unElem) z tr
167 | foldl f z (MkSeq tr) = foldl (\acc, (MkElem elem) => f acc elem) z tr
169 | toList (MkSeq tr) = toList' tr
171 | null (MkSeq Empty) = True
175 | implementation Traversable Seq where
176 | traverse f (MkSeq tr) = MkSeq <$> traverse (map MkElem . f . unElem) tr
179 | implementation Show a => Show (Seq a) where
180 | showPrec p = showPrec p . toList
183 | implementation Zippable Seq where
184 | zipWith f (MkSeq x) (MkSeq y) = MkSeq (zipWith' f x y)
186 | zipWith3 f (MkSeq x) (MkSeq y) (MkSeq z) = MkSeq (zipWith3' f x y z)
188 | unzipWith f (MkSeq zs) = let (xs, ys) = unzipWith' f zs in (MkSeq xs, MkSeq ys)
190 | unzipWith3 f (MkSeq ws) = let (xs, ys, zs) = unzipWith3' f ws in (MkSeq xs, MkSeq ys, MkSeq zs)
193 | implementation Semigroup (Seq a) where
197 | implementation Monoid (Seq a) where
202 | implementation Applicative Seq where
204 | fs <*> xs = foldMap (\f => map f xs) fs
207 | [ListLike] Alternative Seq where
212 | [MaybeLike] Alternative Seq where
214 | MkSeq Empty <|> b = b
218 | implementation Monad Seq where
219 | xs >>= f = foldMap f xs
222 | implementation Sized (Seq a) where
223 | size (MkSeq s) = size s