Skip to content

Commit 903e698

Browse files
committed
[stdlib] Add std.member and std.{l,r,}stripChars
1 parent db3d417 commit 903e698

File tree

3 files changed

+157
-1
lines changed

3 files changed

+157
-1
lines changed

Diff for: doc/ref/stdlib.html

+110
Original file line numberDiff line numberDiff line change
@@ -533,6 +533,93 @@ <h4 id="endsWith">std.endsWith(a, b)</h4>
533533
</div>
534534

535535

536+
<div class="hgroup">
537+
<div class="hgroup-inline">
538+
<div class="panel">
539+
<h4 id="stripChars">std.stripChars(str, chars)</h4>
540+
</div>
541+
<div style="clear: both"></div>
542+
</div>
543+
</div>
544+
545+
<div class="hgroup">
546+
<div class="hgroup-inline">
547+
<div class="panel">
548+
<p>Removes characters <code>chars</code> from the beginning and from the end of <code>str</code>.</p>
549+
</div>
550+
<p>
551+
Example: <code>std.stripChars(" test test test ", " ")</code> yields <code>"test test test"</code>.
552+
</p>
553+
<p>
554+
Example: <code>std.stripChars("aaabbbbcccc", "ac")</code> yields <code>"bbbb"</code>.
555+
</p>
556+
<p>
557+
Example: <code>std.stripChars("cacabbbbaacc", "ac")</code> yields <code>"bbbb"</code>.
558+
</p>
559+
<em>Available in upcoming version.</em>
560+
<div style="clear: both"></div>
561+
</div>
562+
</div>
563+
564+
565+
<div class="hgroup">
566+
<div class="hgroup-inline">
567+
<div class="panel">
568+
<h4 id="lstripChars">std.lstripChars(str, chars)</h4>
569+
</div>
570+
<div style="clear: both"></div>
571+
</div>
572+
</div>
573+
574+
<div class="hgroup">
575+
<div class="hgroup-inline">
576+
<div class="panel">
577+
<p>Removes characters <code>chars</code> from the beginning of <code>str</code>.</p>
578+
</div>
579+
<p>
580+
Example: <code>std.lstripChars(" test test test ", " ")</code> yields <code>"test test test "</code>.
581+
</p>
582+
<p>
583+
Example: <code>std.lstripChars("aaabbbbcccc", "ac")</code> yields <code>"bbbbcccc"</code>.
584+
</p>
585+
<p>
586+
Example: <code>std.lstripChars("cacabbbbaacc", "ac")</code> yields <code>"bbbbaacc"</code>.
587+
</p>
588+
<em>Available in upcoming version.</em>
589+
<div style="clear: both"></div>
590+
</div>
591+
</div>
592+
593+
594+
<div class="hgroup">
595+
<div class="hgroup-inline">
596+
<div class="panel">
597+
<h4 id="rstripChars">std.rstripChars(str, chars)</h4>
598+
</div>
599+
<div style="clear: both"></div>
600+
</div>
601+
</div>
602+
603+
<div class="hgroup">
604+
<div class="hgroup-inline">
605+
<div class="panel">
606+
<p>Removes characters <code>chars</code> from the beginning and from the end of <code>str</code>.</p>
607+
</div>
608+
<p>
609+
Example: <code>std.rstripChars(" test test test ", " ")</code> yields <code>" test test test"</code>.
610+
</p>
611+
<p>
612+
Example: <code>std.rstripChars("aaabbbbcccc", "ac")</code> yields <code>"aaabbbb"</code>.
613+
</p>
614+
<p>
615+
Example: <code>std.rstripChars("cacabbbbaacc", "ac")</code> yields <code>"cacabbbb"</code>.
616+
</p>
617+
<em>Available in upcoming version.</em>
618+
<div style="clear: both"></div>
619+
</div>
620+
</div>
621+
622+
536623
<div class="hgroup">
537624
<div class="hgroup-inline">
538625
<div class="panel">
@@ -1319,6 +1406,29 @@ <h4 id="makeArray">std.makeArray(sz, func)</h4>
13191406
</div>
13201407

13211408

1409+
<div class="hgroup">
1410+
<div class="hgroup-inline">
1411+
<div class="panel">
1412+
<h4 id="member">std.member(arr, x)</h4>
1413+
</div>
1414+
<div style="clear: both"></div>
1415+
</div>
1416+
</div>
1417+
1418+
<div class="hgroup">
1419+
<div class="hgroup-inline">
1420+
<div class="panel">
1421+
<p>
1422+
Returns whether <code>x</code> occurs in <code>arr</code>.
1423+
Argument <code>arr</code> may be an array or a string.
1424+
</p>
1425+
<em>Available in upcoming version.</em>
1426+
</div>
1427+
<div style="clear: both"></div>
1428+
</div>
1429+
</div>
1430+
1431+
13221432
<div class="hgroup">
13231433
<div class="hgroup-inline">
13241434
<div class="panel">

Diff for: stdlib/std.jsonnet

+23-1
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,22 @@ limitations under the License.
5454
else
5555
std.substr(a, std.length(a) - std.length(b), std.length(b)) == b,
5656

57+
lstripChars(str, chars)::
58+
if std.length(str) > 0 && std.member(chars, str[0]) then
59+
std.lstripChars(str[1:], chars)
60+
else
61+
str,
62+
63+
rstripChars(str, chars)::
64+
local len = std.length(str);
65+
if len > 0 && std.member(chars, str[len - 1]) then
66+
std.rstripChars(str[:len - 1], chars)
67+
else
68+
str,
69+
70+
stripChars(str, chars)::
71+
std.lstripChars(std.rstripChars(str, chars), chars),
72+
5773
stringChars(str)::
5874
std.makeArray(std.length(str), function(i) str[i]),
5975

@@ -162,7 +178,6 @@ limitations under the License.
162178
c;
163179
std.join('', std.map(down_letter, std.stringChars(str))),
164180

165-
166181
range(from, to)::
167182
std.makeArray(to - from + 1, function(i) i + from),
168183

@@ -206,6 +221,13 @@ limitations under the License.
206221
) tailstrict;
207222
build(if invar.type == 'string' then '' else [], invar.index),
208223

224+
member(arr, x)::
225+
if std.isArray(arr) then
226+
std.count(arr, x) > 0
227+
else if std.isString(arr) then
228+
std.length(std.findSubstr(x, arr)) > 0
229+
else error "std.member first argument must be an array or a string",
230+
209231
count(arr, x):: std.length(std.filter(function(v) v == x, arr)),
210232

211233
mod(a, b)::

Diff for: test_suite/stdlib.jsonnet

+24
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,15 @@ std.assertEqual(std.isObject(null), false) &&
113113
std.assertEqual(std.isArray(null), false) &&
114114
std.assertEqual(std.isFunction(null), false) &&
115115

116+
std.assertEqual(std.member('foo', 'o'), true) &&
117+
std.assertEqual(std.member('foo', 'f'), true) &&
118+
std.assertEqual(std.member('foo', 'x'), false) &&
119+
std.assertEqual(std.member([], 'o'), false) &&
120+
std.assertEqual(std.member(['f'], 'o'), false) &&
121+
std.assertEqual(std.member(['f', 'o', 'o'], 'o'), true) &&
122+
std.assertEqual(std.member(['f', 'o', 'o'], 'f'), true) &&
123+
std.assertEqual(std.member(['f', 'o', 'o'], 'g'), false) &&
124+
116125
std.assertEqual(std.count([true, false, false, true, true, true, false], true), 4) &&
117126
std.assertEqual(std.count([true, false, false, true, true, true, false], false), 3) &&
118127

@@ -182,6 +191,21 @@ std.assertEqual(std.endsWith('food', 'food'), true) &&
182191
std.assertEqual(std.endsWith('food', 'omgfood'), false) &&
183192
std.assertEqual(std.endsWith('food', 'wat'), false) &&
184193

194+
std.assertEqual(std.stripChars(' test test test ', ' '), 'test test test') &&
195+
std.assertEqual(std.stripChars('aaabbbbcccc', 'ac'), 'bbbb') &&
196+
std.assertEqual(std.stripChars('cacabbbbaacc', 'ac'), 'bbbb') &&
197+
std.assertEqual(std.stripChars('', 'ac'), '') &&
198+
199+
std.assertEqual(std.lstripChars(' test test test ', ' '), 'test test test ') &&
200+
std.assertEqual(std.lstripChars('aaabbbbcccc', 'ac'), 'bbbbcccc') &&
201+
std.assertEqual(std.lstripChars('cacabbbbaacc', 'ac'), 'bbbbaacc') &&
202+
std.assertEqual(std.lstripChars('', 'ac'), '') &&
203+
204+
std.assertEqual(std.rstripChars(' test test test ', ' '), ' test test test') &&
205+
std.assertEqual(std.rstripChars('aaabbbbcccc', 'ac'), 'aaabbbb') &&
206+
std.assertEqual(std.rstripChars('cacabbbbaacc', 'ac'), 'cacabbbb') &&
207+
std.assertEqual(std.rstripChars('', 'ac'), '') &&
208+
185209
std.assertEqual(std.codepoint('a'), 97) &&
186210
std.assertEqual(std.char(97), 'a') &&
187211
std.assertEqual(std.codepoint('\u0000'), 0) &&

0 commit comments

Comments
 (0)