3 | module Data.Seq1.Unsized
5 | import Control.WellFounded
6 | import Data.Linear.Ref1
7 | import public Data.Zippable
9 | import Data.Seq.Internal
15 | data Seq1 : (s : Type) -> (e : Type) -> Type where
16 | MkSeq1 : Ref s (FingerTree (Elem e))
21 | empty : F1 s (Seq1 s e)
23 | let tr # t := ref1 Empty t
31 | let tr # t := ref1 (Single (MkElem a)) t
36 | replicate : (n : Nat)
40 | let tr # t := ref1 (replicate' n a) t
47 | length (MkSeq1 tr) t =
48 | let tr' # t := read1 tr t
55 | reverse (MkSeq1 tr) t =
56 | casmod1 tr (\tr' => reverseTree id tr') t
58 | export infixr 5 `cons`
64 | (a `cons` (MkSeq1 tr)) t =
65 | casmod1 tr (\tr' => MkElem a `consTree` tr') t
67 | export infixl 5 `snoc`
73 | ((MkSeq1 tr) `snoc` a) t =
74 | casmod1 tr (\tr' => tr' `snocTree` MkElem a) t
79 | -> F1 s (Maybe (e, Seq1 s e))
80 | viewl (MkSeq1 tr) t =
83 | case viewLTree tr' of
84 | Just (MkElem a, tr'') =>
85 | (tr'', Just (a, MkSeq1 tr))
94 | head (MkSeq1 tr) t =
95 | let tr' # t := read1 tr t
96 | in case viewLTree tr' of
97 | Just (MkElem a, _) =>
107 | tail (MkSeq1 tr) t =
110 | case viewLTree tr' of
111 | Just (MkElem _, tr'') =>
120 | -> F1 s (Maybe (Seq1 s e, e))
121 | viewr (MkSeq1 tr) t =
124 | case viewRTree tr' of
125 | Just (tr'', MkElem a) =>
126 | (tr'', Just (MkSeq1 tr, a))
136 | init (MkSeq1 tr) t =
139 | case viewRTree tr' of
140 | Just (tr'', MkElem _) =>
150 | last (MkSeq1 tr) t =
151 | let tr' # t := read1 tr t
152 | in case viewRTree tr' of
153 | Just (_, MkElem a) =>
163 | let tr # t := ref1 (foldr (\x, acc => MkElem x `consTree` acc) Empty xs) t
174 | -> (sl : SnocList e)
177 | let tr # t := Data.Seq1.Unsized.viewl seq t
182 | (assert_total (go tr' (sl :< x))) t
189 | index i (MkSeq1 tr) t =
190 | let tr' # t := read1 tr t
191 | in case i < length' tr' of
193 | let (_, MkElem a) := lookupTree i tr'
205 | adjust f i (MkSeq1 tr) t =
208 | case i < length' tr' of
210 | adjustTree (const (map f)) i tr'
222 | adjust (const a) i seq t
229 | show' (MkSeq1 tr) t =
230 | let tr' # t := read1 tr t
231 | in showPrec Open tr' # t