@@ -11,12 +11,26 @@ source $LIB_OSH/byo-server.sh
11
11
source $LIB_YSH/args.ysh
12
12
13
13
proc slurp-by (; num_lines) {
14
- # TODO: (stdin)
15
- for line in (stdin) {
16
- echo TODO
14
+ var buf = []
15
+ for line in (io.stdin) {
16
+ call buf->append(line)
17
+ if (len(buf) === num_lines) {
18
+ json write (buf, space=0)
19
+
20
+ # TODO:
21
+ #call buf->clear()
22
+ setvar buf = []
23
+ }
24
+ }
25
+ if (buf) {
26
+ json write (buf, space=0)
17
27
}
18
28
}
19
29
30
+ proc test-slurp-by {
31
+ seq 8 | slurp-by (3)
32
+ }
33
+
20
34
# Note:
21
35
# - these are all the same algorithm
22
36
# - also word, block, etc. are all optional
@@ -46,33 +60,109 @@ proc test-each-line {
46
60
# ysh-tool test stream.ysh
47
61
#
48
62
# Col
49
-
50
-
51
63
}
52
64
53
65
proc each-row (; ; block) {
54
66
echo TODO
55
67
}
56
68
57
- proc split-by (; ifs=null; block) {
58
- echo TODO
69
+ proc split-by (; delim; ifs=null; block) {
70
+
71
+ # TODO: provide the option to bind names? Or is that a separate thing?
72
+ # The output of this is "ragged"
73
+
74
+ for line in (io.stdin) {
75
+ #pp (line)
76
+ var parts = line.split(delim)
77
+ pp (parts)
78
+
79
+ # variable number
80
+ call io->eval(block, dollar0=line, pos_args=parts)
81
+ }
59
82
}
60
83
61
- proc if-split-by (; ifs=null; block) {
84
+ proc chop () {
85
+ ### alias for split-by
62
86
echo TODO
63
87
}
64
88
65
- proc chop () {
66
- ### alias for if-split-by
89
+ proc test-split-by {
90
+ var z = 'z' # test out scoping
91
+ var count = 0 # test out mutation
92
+
93
+ # TODO: need split by space
94
+ # Where the leading and trailing are split
95
+ # if-split-by(' ') doesn't work well
96
+
97
+ line-data | split-by (/s+/) {
98
+
99
+ # how do we deal with nonexistent?
100
+ # should we also bind _parts or _words?
101
+
102
+ echo "$z | $0 | $1 | $z"
103
+
104
+ setvar count += 1
105
+ }
106
+ echo "count = $count"
107
+ }
108
+
109
+ proc must-split-by (; ; ifs=null; block) {
110
+ ### like if-split-by
111
+
67
112
echo TODO
68
113
}
69
114
115
+ proc if-match (; pattern; ; block) {
116
+ ### like 'grep' but with submatches
117
+
118
+ for line in (io.stdin) {
119
+ var m = line.search(pattern)
120
+ if (m) {
121
+ #pp asdl_ (m)
122
+ #var groups = m.groups()
123
+
124
+ # Should we also pass _line?
125
+ call io->eval(block, dollar0=m.group(0))
126
+ }
127
+ }
128
+
129
+ # always succeeds - I think must-match is the one that can fail
130
+ }
131
+
70
132
proc must-match (; pattern; block) {
133
+ ### like if-match
134
+
71
135
echo TODO
72
136
}
73
137
74
- proc if-match (; pattern; block) {
75
- echo TODO
138
+ proc line-data {
139
+ # note: trailing ''' issue, I should probably get rid of the last line
140
+
141
+ echo '''
142
+ prefix 30 foo
143
+ oils
144
+ /// 42 bar'''
145
+ }
146
+
147
+ proc test-if-match {
148
+ var z = 'z' # test out scoping
149
+ var count = 0 # test out mutation
150
+
151
+ # Test cases should be like:
152
+ # grep: print the matches, or just count them
153
+ # sed: print a new line based on submatches
154
+ # awk: re-arrange the cols, and also accumulate counters
155
+
156
+ var pat = /<capture d+> s+ <capture w+>/
157
+ line-data | if-match (pat) {
158
+ echo "$z $0 $z"
159
+ # TODO: need pos_args
160
+
161
+ #echo "-- $2 $1 --"
162
+
163
+ setvar count += 1
164
+ }
165
+ echo "count = $count"
76
166
}
77
167
78
168
# Protocol:
0 commit comments