Skip to content

Commit f775e61

Browse files
committed
feat: take1UpTo, sepBy, sepBy1, sepByUpTo, sep1By1UpTo
1 parent 8074294 commit f775e61

1 file changed

Lines changed: 50 additions & 3 deletions

File tree

Binary/Get.lean

Lines changed: 50 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ def many1 (p : Get α) : Get (Array α) := do
2525

2626
@[inline, specialize]
2727
def 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]
4960
def 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]
5970
def 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+
71118
end
72119

73120
public section

0 commit comments

Comments
 (0)