@@ -25,7 +25,7 @@ def many1 (p : Get α) : Get (Array α) := do
2525
2626@ [inline, specialize]
2727def takeAtLeast (n : Nat) (p : Get α) : Get (Array α) := do
28- let mut r := #[]
28+ let mut r := Array.emptyWithCapacity n
2929 repeat
3030 if r.size == n then break
3131 let x ← p
@@ -45,9 +45,20 @@ def takeUpTo (n : Nat) (p : Get α) : Get (Array α) := do
4545 r := r.push x
4646 return r
4747
48+ /-- inclusive -/
49+ @ [inline, specialize]
50+ def take1UpTo (n : Nat) (p : Get α) : Get (Array α) := do
51+ let x ← p
52+ let mut r := #[x]
53+ repeat
54+ if r.size == n then break
55+ let some x ← optional p | break
56+ r := r.push x
57+ return r
58+
4859@ [inline, specialize]
4960def takeN (n : Nat) (p : Get α) : Get (Array α) := do
50- let mut r := #[]
61+ let mut r := Array.emptyWithCapacity 0
5162 repeat
5263 if r.size == n then break
5364 let x ← p
@@ -57,7 +68,7 @@ def takeN (n : Nat) (p : Get α) : Get (Array α) := do
5768/--inclusive on both sides -/
5869@ [inline, specialize]
5970def takeRange (min max : Nat) (p : Get α) : Get (Array α) := do
60- let mut r := #[]
71+ let mut r := Array.emptyWithCapacity min
6172 repeat
6273 if r.size == min then break
6374 let x ← p
@@ -68,6 +79,42 @@ def takeRange (min max : Nat) (p : Get α) : Get (Array α) := do
6879 r := r.push x
6980 return r
7081
82+ @ [inline, specialize]
83+ def sepBy (x : Get α) (sep : Get Unit) : Get (Array α) := do
84+ let mut t := #[]
85+ repeat
86+ let some v ← optional (sep *> x) | break
87+ t := t.push v
88+ return t
89+
90+ @ [inline, specialize]
91+ def sepBy1 (x : Get α) (s : Get Unit) : Get (Array α) := do
92+ let l ← x
93+ let mut t := #[l]
94+ repeat
95+ let some v ← optional (s *> x) | break
96+ t := t.push v
97+ return t
98+
99+ @ [inline, specialize]
100+ def sepByUpTo (n : Nat) (x : Get α) (s : Get Unit) : Get (Array α) := do
101+ let mut t := #[]
102+ repeat
103+ if t.size ≥ n then break
104+ let some v ← optional (s *> x) | break
105+ t := t.push v
106+ return t
107+
108+ @ [inline, specialize]
109+ def sepBy1UpTo (n : Nat) (x : Get α) (s : Get Unit) : Get (Array α) := do
110+ let l ← x
111+ let mut t := #[l]
112+ repeat
113+ if t.size ≥ n then break
114+ let some v ← optional (s *> x) | break
115+ t := t.push v
116+ return t
117+
71118end
72119
73120public section
0 commit comments