-
Notifications
You must be signed in to change notification settings - Fork 0
/
tuple.go
118 lines (99 loc) · 2.3 KB
/
tuple.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package combinator
import (
"github.com/flier/gocombine/pkg/parser"
"github.com/flier/gocombine/pkg/stream"
"github.com/flier/gocombine/pkg/tuple"
)
// Tuple3 parses a tuple of heterogeneous values.
func Tuple3[
T stream.Token,
O1, O2, O3 any,
](
p1 parser.Func[T, O1],
p2 parser.Func[T, O2],
p3 parser.Func[T, O3],
) parser.Func[T, tuple.Tuple3[O1, O2, O3]] {
return parser.Expected(func(input []T) (out tuple.Tuple3[O1, O2, O3], remaining []T, err error) {
var o1 O1
if o1, remaining, err = p1(input); err != nil {
return
}
var o2 O2
if o2, remaining, err = p2(remaining); err != nil {
return
}
var o3 O3
if o3, remaining, err = p3(remaining); err != nil {
return
}
out = tuple.New3(o1, o2, o3)
return
}, "tuple3")
}
// Tuple4 parses a tuple of heterogeneous values.
func Tuple4[
T stream.Token,
O1, O2, O3, O4 any,
](
p1 parser.Func[T, O1],
p2 parser.Func[T, O2],
p3 parser.Func[T, O3],
p4 parser.Func[T, O4],
) parser.Func[T, tuple.Tuple4[O1, O2, O3, O4]] {
return parser.Expected(func(input []T) (out tuple.Tuple4[O1, O2, O3, O4], remaining []T, err error) {
var o1 O1
if o1, remaining, err = p1(input); err != nil {
return
}
var o2 O2
if o2, remaining, err = p2(remaining); err != nil {
return
}
var o3 O3
if o3, remaining, err = p3(remaining); err != nil {
return
}
var o4 O4
if o4, remaining, err = p4(remaining); err != nil {
return
}
out = tuple.New4(o1, o2, o3, o4)
return
}, "tuple4")
}
// Tuple5 parses a tuple of heterogeneous values.
func Tuple5[
T stream.Token,
O1, O2, O3, O4, O5 any,
](
p1 parser.Func[T, O1],
p2 parser.Func[T, O2],
p3 parser.Func[T, O3],
p4 parser.Func[T, O4],
p5 parser.Func[T, O5],
) parser.Func[T, tuple.Tuple5[O1, O2, O3, O4, O5]] {
return parser.Expected(func(input []T) (out tuple.Tuple5[O1, O2, O3, O4, O5], remaining []T, err error) {
var o1 O1
if o1, remaining, err = p1(input); err != nil {
return
}
var o2 O2
if o2, remaining, err = p2(remaining); err != nil {
return
}
var o3 O3
if o3, remaining, err = p3(remaining); err != nil {
return
}
var o4 O4
if o4, remaining, err = p4(remaining); err != nil {
return
}
var o5 O5
if o5, remaining, err = p5(remaining); err != nil {
return
}
out = tuple.New5(o1, o2, o3, o4, o5)
return
}, "tuple5")
}