aboutsummaryrefslogtreecommitdiff
path: root/stdlib
diff options
context:
space:
mode:
Diffstat (limited to 'stdlib')
-rw-r--r--stdlib/patterns.c8
-rw-r--r--stdlib/patterns.h4
2 files changed, 8 insertions, 4 deletions
diff --git a/stdlib/patterns.c b/stdlib/patterns.c
index 226856ba..ad6267f0 100644
--- a/stdlib/patterns.c
+++ b/stdlib/patterns.c
@@ -1042,7 +1042,7 @@ public Text_t Text$trim(Text_t text, Pattern_t pattern, bool trim_left, bool tri
return Text$slice(text, I(first+1), I(last+1));
}
-public Text_t Text$map(Text_t text, Pattern_t pattern, Closure_t fn)
+public Text_t Text$map(Text_t text, Pattern_t pattern, Closure_t fn, bool recursive)
{
Text_t ret = EMPTY_TEXT;
@@ -1073,6 +1073,8 @@ public Text_t Text$map(Text_t text, Pattern_t pattern, Closure_t fn)
};
for (int i = 0; captures[i].occupied; i++) {
Text_t capture = Text$slice(text, I(captures[i].index+1), I(captures[i].index+captures[i].length));
+ if (recursive)
+ capture = Text$map(capture, pattern, fn, recursive);
Array$insert(&m.captures, &capture, I(0), sizeof(Text_t));
}
@@ -1093,7 +1095,7 @@ public Text_t Text$map(Text_t text, Pattern_t pattern, Closure_t fn)
return ret;
}
-public void Text$each(Text_t text, Pattern_t pattern, Closure_t fn)
+public void Text$each(Text_t text, Pattern_t pattern, Closure_t fn, bool recursive)
{
int32_t first_grapheme = Text$get_grapheme(pattern, 0);
bool find_first = (first_grapheme != '{'
@@ -1120,6 +1122,8 @@ public void Text$each(Text_t text, Pattern_t pattern, Closure_t fn)
};
for (int i = 0; captures[i].occupied; i++) {
Text_t capture = Text$slice(text, I(captures[i].index+1), I(captures[i].index+captures[i].length));
+ if (recursive)
+ Text$each(capture, pattern, fn, recursive);
Array$insert(&m.captures, &capture, I(0), sizeof(Text_t));
}
diff --git a/stdlib/patterns.h b/stdlib/patterns.h
index 494c8338..53db0978 100644
--- a/stdlib/patterns.h
+++ b/stdlib/patterns.h
@@ -34,8 +34,8 @@ Array_t Text$find_all(Text_t text, Pattern_t pattern);
Closure_t Text$by_match(Text_t text, Pattern_t pattern);
PUREFUNC bool Text$has(Text_t text, Pattern_t pattern);
OptionalArray_t Text$matches(Text_t text, Pattern_t pattern);
-Text_t Text$map(Text_t text, Pattern_t pattern, Closure_t fn);
-void Text$each(Text_t text, Pattern_t pattern, Closure_t fn);
+Text_t Text$map(Text_t text, Pattern_t pattern, Closure_t fn, bool recursive);
+void Text$each(Text_t text, Pattern_t pattern, Closure_t fn, bool recursive);
#define Pattern$hash Text$hash
#define Pattern$compare Text$compare