Repository: go-sprout/sprout
Pull request #70 (2024-09-16 22:03:27)

feat: batch of new functions (slices, regexp, conversion)
## Description
This pull request add a batch of new functions according to requests on sprig issues and pull requests or direct on sprout.

## Changes
- Add `toLocalDate` function to conversion registry
- Add `regexpFindGroups`, `regexpAllGroups`, `regexpFindNamed`, `regexpAllNamed` functions to regex registry
- Add `flatten`, `flattenDepth` to slices registry 

## Checklist
- [x] I have read the **CONTRIBUTING.md** document.
- [x] My code follows the code style of this project.
- [x] I have added tests to cover my changes.
- [x] All new and existing tests passed.
- [x] I have updated the documentation accordingly.
- [x] This change requires a change to the documentation on the website.

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/go-sprout/sprout/pull/70?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) Report
All modified and coverable lines are covered by tests :white_check_mark:

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/70?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Coverage Δ | |
|---|---|---|
| [registry/slices/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL2Z1bmN0aW9ucy5nbw==) | `100.0% <100.0%> (ø)` | |
| [registry/slices/helpers.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Fhelpers.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL2hlbHBlcnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/slices/slices.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Fslices.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL3NsaWNlcy5nbw==) | `96.7% <100.0%> (+0.1%)` | :arrow_up: |

... and [23 files with indirect coverage changes](https://app.codecov.io/gh/go-sprout/sprout/pull/70/indirect-changes?src=pr&el=tree-more&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout)

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/go-sprout/sprout/pull/70?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) Report
All modified and coverable lines are covered by tests :white_check_mark:

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/70?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Coverage Δ | |
|---|---|---|
| [registry/slices/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL2Z1bmN0aW9ucy5nbw==) | `100.0% <100.0%> (ø)` | |
| [registry/slices/helpers.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Fhelpers.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL2hlbHBlcnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/slices/slices.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Fslices.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL3NsaWNlcy5nbw==) | `96.7% <100.0%> (+0.1%)` | :arrow_up: |

... and [23 files with indirect coverage changes](https://app.codecov.io/gh/go-sprout/sprout/pull/70/indirect-changes?src=pr&el=tree-more&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout)

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/go-sprout/sprout/pull/70?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) Report
All modified and coverable lines are covered by tests :white_check_mark:

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/70?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Coverage Δ | |
|---|---|---|
| [registry/slices/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL2Z1bmN0aW9ucy5nbw==) | `100.0% <100.0%> (ø)` | |
| [registry/slices/helpers.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Fhelpers.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL2hlbHBlcnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/slices/slices.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Fslices.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL3NsaWNlcy5nbw==) | `96.7% <100.0%> (+0.1%)` | :arrow_up: |

... and [23 files with indirect coverage changes](https://app.codecov.io/gh/go-sprout/sprout/pull/70/indirect-changes?src=pr&el=tree-more&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout)

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/go-sprout/sprout/pull/70?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) Report
All modified and coverable lines are covered by tests :white_check_mark:

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/70?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Coverage Δ | |
|---|---|---|
| [registry/slices/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL2Z1bmN0aW9ucy5nbw==) | `100.0% <100.0%> (ø)` | |
| [registry/slices/helpers.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Fhelpers.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL2hlbHBlcnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/slices/slices.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Fslices.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL3NsaWNlcy5nbw==) | `96.7% <100.0%> (+0.1%)` | :arrow_up: |

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/go-sprout/sprout/pull/70?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) Report
All modified and coverable lines are covered by tests :white_check_mark:

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/70?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Coverage Δ | |
|---|---|---|
| [registry/slices/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL2Z1bmN0aW9ucy5nbw==) | `100.0% <100.0%> (ø)` | |
| [registry/slices/helpers.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Fhelpers.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL2hlbHBlcnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/slices/slices.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Fslices.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL3NsaWNlcy5nbw==) | `96.7% <100.0%> (+0.1%)` | :arrow_up: |

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/go-sprout/sprout/pull/70?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) Report
All modified and coverable lines are covered by tests :white_check_mark:

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/70?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Coverage Δ | |
|---|---|---|
| [registry/slices/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL2Z1bmN0aW9ucy5nbw==) | `100.0% <100.0%> (ø)` | |
| [registry/slices/helpers.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Fhelpers.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL2hlbHBlcnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/slices/slices.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Fslices.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL3NsaWNlcy5nbw==) | `96.7% <100.0%> (+0.1%)` | :arrow_up: |

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/go-sprout/sprout/pull/70?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) Report
All modified and coverable lines are covered by tests :white_check_mark:

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/70?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Coverage Δ | |
|---|---|---|
| [registry/regexp/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fregexp%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvcmVnZXhwL2Z1bmN0aW9ucy5nbw==) | `100.0% <100.0%> (ø)` | |
| [registry/regexp/regexp.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fregexp%2Fregexp.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvcmVnZXhwL3JlZ2V4cC5nbw==) | `94.4% <100.0%> (+0.6%)` | :arrow_up: |
| [registry/slices/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL2Z1bmN0aW9ucy5nbw==) | `100.0% <100.0%> (ø)` | |
| [registry/slices/helpers.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Fhelpers.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL2hlbHBlcnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/slices/slices.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Fslices.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL3NsaWNlcy5nbw==) | `96.7% <100.0%> (+0.1%)` | :arrow_up: |

... and [22 files with indirect coverage changes](https://app.codecov.io/gh/go-sprout/sprout/pull/70/indirect-changes?src=pr&el=tree-more&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout)

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/go-sprout/sprout/pull/70?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) Report
All modified and coverable lines are covered by tests :white_check_mark:

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/70?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Coverage Δ | |
|---|---|---|
| [registry/regexp/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fregexp%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvcmVnZXhwL2Z1bmN0aW9ucy5nbw==) | `100.0% <100.0%> (ø)` | |
| [registry/regexp/regexp.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fregexp%2Fregexp.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvcmVnZXhwL3JlZ2V4cC5nbw==) | `94.4% <100.0%> (+0.6%)` | :arrow_up: |
| [registry/slices/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL2Z1bmN0aW9ucy5nbw==) | `100.0% <100.0%> (ø)` | |
| [registry/slices/helpers.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Fhelpers.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL2hlbHBlcnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/slices/slices.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Fslices.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL3NsaWNlcy5nbw==) | `96.7% <100.0%> (+0.1%)` | :arrow_up: |

... and [22 files with indirect coverage changes](https://app.codecov.io/gh/go-sprout/sprout/pull/70/indirect-changes?src=pr&el=tree-more&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout)

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/go-sprout/sprout/pull/70?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) Report
All modified and coverable lines are covered by tests :white_check_mark:

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/70?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Coverage Δ | |
|---|---|---|
| [registry/regexp/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fregexp%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvcmVnZXhwL2Z1bmN0aW9ucy5nbw==) | `100.0% <100.0%> (ø)` | |
| [registry/regexp/regexp.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fregexp%2Fregexp.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvcmVnZXhwL3JlZ2V4cC5nbw==) | `94.4% <100.0%> (+0.6%)` | :arrow_up: |
| [registry/slices/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL2Z1bmN0aW9ucy5nbw==) | `100.0% <100.0%> (ø)` | |
| [registry/slices/helpers.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Fhelpers.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL2hlbHBlcnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/slices/slices.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Fslices.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL3NsaWNlcy5nbw==) | `96.7% <100.0%> (+0.1%)` | :arrow_up: |

... and [22 files with indirect coverage changes](https://app.codecov.io/gh/go-sprout/sprout/pull/70/indirect-changes?src=pr&el=tree-more&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout)

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/go-sprout/sprout/pull/70?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) Report
All modified and coverable lines are covered by tests :white_check_mark:

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/70?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Coverage Δ | |
|---|---|---|
| [registry/regexp/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fregexp%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvcmVnZXhwL2Z1bmN0aW9ucy5nbw==) | `100.0% <100.0%> (ø)` | |
| [registry/regexp/regexp.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fregexp%2Fregexp.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvcmVnZXhwL3JlZ2V4cC5nbw==) | `94.4% <100.0%> (+0.6%)` | :arrow_up: |
| [registry/slices/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL2Z1bmN0aW9ucy5nbw==) | `100.0% <100.0%> (ø)` | |
| [registry/slices/helpers.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Fhelpers.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL2hlbHBlcnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/slices/slices.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Fslices.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL3NsaWNlcy5nbw==) | `96.7% <100.0%> (+0.1%)` | :arrow_up: |

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/go-sprout/sprout/pull/70?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) Report
All modified and coverable lines are covered by tests :white_check_mark:

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/70?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Coverage Δ | |
|---|---|---|
| [registry/regexp/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fregexp%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvcmVnZXhwL2Z1bmN0aW9ucy5nbw==) | `100.0% <100.0%> (ø)` | |
| [registry/regexp/regexp.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fregexp%2Fregexp.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvcmVnZXhwL3JlZ2V4cC5nbw==) | `94.4% <100.0%> (+0.6%)` | :arrow_up: |
| [registry/slices/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL2Z1bmN0aW9ucy5nbw==) | `100.0% <100.0%> (ø)` | |
| [registry/slices/helpers.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Fhelpers.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL2hlbHBlcnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/slices/slices.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Fslices.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL3NsaWNlcy5nbw==) | `96.7% <100.0%> (+0.1%)` | :arrow_up: |

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/go-sprout/sprout/pull/70?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) Report
All modified and coverable lines are covered by tests :white_check_mark:

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/70?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Coverage Δ | |
|---|---|---|
| [registry/regexp/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fregexp%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvcmVnZXhwL2Z1bmN0aW9ucy5nbw==) | `100.0% <100.0%> (ø)` | |
| [registry/regexp/regexp.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fregexp%2Fregexp.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvcmVnZXhwL3JlZ2V4cC5nbw==) | `94.4% <100.0%> (+0.6%)` | :arrow_up: |
| [registry/slices/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL2Z1bmN0aW9ucy5nbw==) | `100.0% <100.0%> (ø)` | |
| [registry/slices/helpers.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Fhelpers.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL2hlbHBlcnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/slices/slices.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Fslices.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL3NsaWNlcy5nbw==) | `96.7% <100.0%> (+0.1%)` | :arrow_up: |

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/go-sprout/sprout/pull/70?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) Report
All modified and coverable lines are covered by tests :white_check_mark:

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/70?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Coverage Δ | |
|---|---|---|
| [registry/conversion/conversion.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fconversion%2Fconversion.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvY29udmVyc2lvbi9jb252ZXJzaW9uLmdv) | `92.3% <100.0%> (+0.3%)` | :arrow_up: |
| [registry/conversion/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fconversion%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvY29udmVyc2lvbi9mdW5jdGlvbnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/regexp/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fregexp%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvcmVnZXhwL2Z1bmN0aW9ucy5nbw==) | `100.0% <100.0%> (ø)` | |
| [registry/regexp/regexp.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fregexp%2Fregexp.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvcmVnZXhwL3JlZ2V4cC5nbw==) | `94.4% <100.0%> (+0.6%)` | :arrow_up: |
| [registry/slices/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL2Z1bmN0aW9ucy5nbw==) | `100.0% <100.0%> (ø)` | |
| [registry/slices/helpers.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Fhelpers.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL2hlbHBlcnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/slices/slices.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Fslices.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL3NsaWNlcy5nbw==) | `96.7% <100.0%> (+0.1%)` | :arrow_up: |

... and [21 files with indirect coverage changes](https://app.codecov.io/gh/go-sprout/sprout/pull/70/indirect-changes?src=pr&el=tree-more&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout)

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/go-sprout/sprout/pull/70?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) Report
All modified and coverable lines are covered by tests :white_check_mark:

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/70?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Coverage Δ | |
|---|---|---|
| [registry/conversion/conversion.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fconversion%2Fconversion.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvY29udmVyc2lvbi9jb252ZXJzaW9uLmdv) | `92.3% <100.0%> (+0.3%)` | :arrow_up: |
| [registry/conversion/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fconversion%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvY29udmVyc2lvbi9mdW5jdGlvbnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/regexp/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fregexp%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvcmVnZXhwL2Z1bmN0aW9ucy5nbw==) | `100.0% <100.0%> (ø)` | |
| [registry/regexp/regexp.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fregexp%2Fregexp.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvcmVnZXhwL3JlZ2V4cC5nbw==) | `94.4% <100.0%> (+0.6%)` | :arrow_up: |
| [registry/slices/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL2Z1bmN0aW9ucy5nbw==) | `100.0% <100.0%> (ø)` | |
| [registry/slices/helpers.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Fhelpers.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL2hlbHBlcnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/slices/slices.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Fslices.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL3NsaWNlcy5nbw==) | `96.7% <100.0%> (+0.1%)` | :arrow_up: |

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/go-sprout/sprout/pull/70?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) Report
All modified and coverable lines are covered by tests :white_check_mark:

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/70?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Coverage Δ | |
|---|---|---|
| [registry/conversion/conversion.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fconversion%2Fconversion.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvY29udmVyc2lvbi9jb252ZXJzaW9uLmdv) | `92.3% <100.0%> (+0.3%)` | :arrow_up: |
| [registry/conversion/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fconversion%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvY29udmVyc2lvbi9mdW5jdGlvbnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/regexp/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fregexp%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvcmVnZXhwL2Z1bmN0aW9ucy5nbw==) | `100.0% <100.0%> (ø)` | |
| [registry/regexp/regexp.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fregexp%2Fregexp.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvcmVnZXhwL3JlZ2V4cC5nbw==) | `94.4% <100.0%> (+0.6%)` | :arrow_up: |
| [registry/slices/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL2Z1bmN0aW9ucy5nbw==) | `100.0% <100.0%> (ø)` | |
| [registry/slices/helpers.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Fhelpers.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL2hlbHBlcnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/slices/slices.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Fslices.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL3NsaWNlcy5nbw==) | `96.7% <100.0%> (+0.1%)` | :arrow_up: |

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/go-sprout/sprout/pull/70?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) Report
All modified and coverable lines are covered by tests :white_check_mark:

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/70?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Coverage Δ | |
|---|---|---|
| [registry/conversion/conversion.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fconversion%2Fconversion.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvY29udmVyc2lvbi9jb252ZXJzaW9uLmdv) | `92.3% <100.0%> (+0.3%)` | :arrow_up: |
| [registry/conversion/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fconversion%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvY29udmVyc2lvbi9mdW5jdGlvbnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/regexp/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fregexp%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvcmVnZXhwL2Z1bmN0aW9ucy5nbw==) | `100.0% <100.0%> (ø)` | |
| [registry/regexp/regexp.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fregexp%2Fregexp.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvcmVnZXhwL3JlZ2V4cC5nbw==) | `94.4% <100.0%> (+0.6%)` | :arrow_up: |
| [registry/slices/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL2Z1bmN0aW9ucy5nbw==) | `100.0% <100.0%> (ø)` | |
| [registry/slices/helpers.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Fhelpers.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL2hlbHBlcnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/slices/slices.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Fslices.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL3NsaWNlcy5nbw==) | `96.7% <100.0%> (+0.1%)` | :arrow_up: |

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/go-sprout/sprout/pull/70?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) Report
All modified and coverable lines are covered by tests :white_check_mark:

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/70?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Coverage Δ | |
|---|---|---|
| [registry/conversion/conversion.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fconversion%2Fconversion.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvY29udmVyc2lvbi9jb252ZXJzaW9uLmdv) | `92.3% <100.0%> (+0.3%)` | :arrow_up: |
| [registry/conversion/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fconversion%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvY29udmVyc2lvbi9mdW5jdGlvbnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/regexp/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fregexp%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvcmVnZXhwL2Z1bmN0aW9ucy5nbw==) | `100.0% <100.0%> (ø)` | |
| [registry/regexp/regexp.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fregexp%2Fregexp.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvcmVnZXhwL3JlZ2V4cC5nbw==) | `94.4% <100.0%> (+0.6%)` | :arrow_up: |
| [registry/slices/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL2Z1bmN0aW9ucy5nbw==) | `100.0% <100.0%> (ø)` | |
| [registry/slices/helpers.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Fhelpers.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL2hlbHBlcnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/slices/slices.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Fslices.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL3NsaWNlcy5nbw==) | `96.7% <100.0%> (+0.1%)` | :arrow_up: |

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/go-sprout/sprout/pull/70?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) Report
All modified and coverable lines are covered by tests :white_check_mark:

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/70?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Coverage Δ | |
|---|---|---|
| [registry/conversion/conversion.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fconversion%2Fconversion.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvY29udmVyc2lvbi9jb252ZXJzaW9uLmdv) | `92.3% <100.0%> (+0.3%)` | :arrow_up: |
| [registry/conversion/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fconversion%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvY29udmVyc2lvbi9mdW5jdGlvbnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/regexp/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fregexp%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvcmVnZXhwL2Z1bmN0aW9ucy5nbw==) | `100.0% <100.0%> (ø)` | |
| [registry/regexp/regexp.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fregexp%2Fregexp.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvcmVnZXhwL3JlZ2V4cC5nbw==) | `94.4% <100.0%> (+0.6%)` | :arrow_up: |
| [registry/slices/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL2Z1bmN0aW9ucy5nbw==) | `100.0% <100.0%> (ø)` | |
| [registry/slices/helpers.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Fhelpers.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL2hlbHBlcnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/slices/slices.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Fslices.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL3NsaWNlcy5nbw==) | `96.7% <100.0%> (+0.1%)` | :arrow_up: |

... and [21 files with indirect coverage changes](https://app.codecov.io/gh/go-sprout/sprout/pull/70/indirect-changes?src=pr&el=tree-more&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout)

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/go-sprout/sprout/pull/70?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) Report
All modified and coverable lines are covered by tests :white_check_mark:

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/70?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Coverage Δ | |
|---|---|---|
| [registry/conversion/conversion.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fconversion%2Fconversion.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvY29udmVyc2lvbi9jb252ZXJzaW9uLmdv) | `92.3% <100.0%> (+0.3%)` | :arrow_up: |
| [registry/conversion/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fconversion%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvY29udmVyc2lvbi9mdW5jdGlvbnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/regexp/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fregexp%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvcmVnZXhwL2Z1bmN0aW9ucy5nbw==) | `100.0% <100.0%> (ø)` | |
| [registry/regexp/regexp.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fregexp%2Fregexp.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvcmVnZXhwL3JlZ2V4cC5nbw==) | `94.4% <100.0%> (+0.6%)` | :arrow_up: |
| [registry/slices/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL2Z1bmN0aW9ucy5nbw==) | `100.0% <100.0%> (ø)` | |
| [registry/slices/helpers.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Fhelpers.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL2hlbHBlcnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/slices/slices.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Fslices.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL3NsaWNlcy5nbw==) | `96.7% <100.0%> (+0.1%)` | :arrow_up: |

... and [21 files with indirect coverage changes](https://app.codecov.io/gh/go-sprout/sprout/pull/70/indirect-changes?src=pr&el=tree-more&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout)

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/go-sprout/sprout/pull/70?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) Report
All modified and coverable lines are covered by tests :white_check_mark:

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/70?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Coverage Δ | |
|---|---|---|
| [registry/conversion/conversion.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fconversion%2Fconversion.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvY29udmVyc2lvbi9jb252ZXJzaW9uLmdv) | `92.3% <100.0%> (+0.3%)` | :arrow_up: |
| [registry/conversion/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fconversion%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvY29udmVyc2lvbi9mdW5jdGlvbnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/regexp/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fregexp%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvcmVnZXhwL2Z1bmN0aW9ucy5nbw==) | `100.0% <100.0%> (ø)` | |
| [registry/regexp/regexp.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fregexp%2Fregexp.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvcmVnZXhwL3JlZ2V4cC5nbw==) | `94.4% <100.0%> (+0.6%)` | :arrow_up: |
| [registry/slices/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL2Z1bmN0aW9ucy5nbw==) | `100.0% <100.0%> (ø)` | |
| [registry/slices/helpers.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Fhelpers.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL2hlbHBlcnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/slices/slices.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Fslices.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL3NsaWNlcy5nbw==) | `96.7% <100.0%> (+0.1%)` | :arrow_up: |

... and [21 files with indirect coverage changes](https://app.codecov.io/gh/go-sprout/sprout/pull/70/indirect-changes?src=pr&el=tree-more&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout)

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/go-sprout/sprout/pull/70?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) Report
All modified and coverable lines are covered by tests :white_check_mark:

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/70?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Coverage Δ | |
|---|---|---|
| [registry/conversion/conversion.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fconversion%2Fconversion.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvY29udmVyc2lvbi9jb252ZXJzaW9uLmdv) | `92.3% <100.0%> (+0.3%)` | :arrow_up: |
| [registry/conversion/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fconversion%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvY29udmVyc2lvbi9mdW5jdGlvbnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/regexp/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fregexp%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvcmVnZXhwL2Z1bmN0aW9ucy5nbw==) | `100.0% <100.0%> (ø)` | |
| [registry/regexp/regexp.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fregexp%2Fregexp.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvcmVnZXhwL3JlZ2V4cC5nbw==) | `94.4% <100.0%> (+0.6%)` | :arrow_up: |
| [registry/slices/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL2Z1bmN0aW9ucy5nbw==) | `100.0% <100.0%> (ø)` | |
| [registry/slices/helpers.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Fhelpers.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL2hlbHBlcnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/slices/slices.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Fslices.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL3NsaWNlcy5nbw==) | `96.7% <100.0%> (+0.1%)` | :arrow_up: |

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/go-sprout/sprout/pull/70?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) Report
All modified and coverable lines are covered by tests :white_check_mark:

| [Files with missing lines](https://app.codecov.io/gh/go-sprout/sprout/pull/70?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout) | Coverage Δ | |
|---|---|---|
| [registry/conversion/conversion.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fconversion%2Fconversion.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvY29udmVyc2lvbi9jb252ZXJzaW9uLmdv) | `92.3% <100.0%> (+0.3%)` | :arrow_up: |
| [registry/conversion/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fconversion%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvY29udmVyc2lvbi9mdW5jdGlvbnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/regexp/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fregexp%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvcmVnZXhwL2Z1bmN0aW9ucy5nbw==) | `100.0% <100.0%> (ø)` | |
| [registry/regexp/regexp.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fregexp%2Fregexp.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvcmVnZXhwL3JlZ2V4cC5nbw==) | `94.4% <100.0%> (+0.6%)` | :arrow_up: |
| [registry/slices/functions.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Ffunctions.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL2Z1bmN0aW9ucy5nbw==) | `100.0% <100.0%> (ø)` | |
| [registry/slices/helpers.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Fhelpers.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL2hlbHBlcnMuZ28=) | `100.0% <100.0%> (ø)` | |
| [registry/slices/slices.go](https://app.codecov.io/gh/go-sprout/sprout/pull/70?src=pr&el=tree&filepath=registry%2Fslices%2Fslices.go&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=go-sprout#diff-cmVnaXN0cnkvc2xpY2VzL3NsaWNlcy5nbw==) | `96.7% <100.0%> (+0.1%)` | :arrow_up: |


Patch:
diff --git a/docs/registries/conversion.md b/docs/registries/conversion.md
index 48f8553..52128bd 100644
--- a/docs/registries/conversion.md
+++ b/docs/registries/conversion.md
@@ -188,6 +188,30 @@ _This example will takes the_ `"2024-05-10 11:12:42"` _string and convert it wit
 See more about Golang Layout on the [official documentation](https://go.dev/src/time/format.go).
 {% endhint %}
 
+### <mark style="color:purple;">toLocalDate</mark>
+
+toLocalDate converts a string to a time.Time object based on a format specification and the local timezone.
+
+<table data-header-hidden><thead><tr><th width="162">Name</th><th>Value</th></tr></thead><tbody><tr><td>Signature</td><td><pre class="language-go"><code class="lang-go">ToLocalDate(fmt, timezone, str string) (time.Time, error)
+</code></pre></td></tr></tbody></table>
+
+{% tabs %}
+{% tab title="Template Example" %}
+```go
+{{ "2024-09-17 11:12:42" | toLocalDate "2006-01-02" "Europe/Paris" }}
+// Output: 2024-09-17 00:00:00 +0200 CEST, nil
+{{ "2024-09-17 11:12:42" | toLocalDate "2006-01-02" "MST" }}
+// Output: 2024-09-17 00:00:00 -0700 MST, nil
+{{ "2024-09-17 11:12:42" | toLocalDate "2006-01-02" "invalid" }}
+// Error
+```
+{% endtab %}
+{% endtabs %}
+
+{% hint style="info" %}
+See more about Golang Layout on the [official documentation](https://go.dev/src/time/format.go).
+{% endhint %}
+
 ### <mark style="color:purple;">toDuration</mark>
 
 toDuration converts a value to a `time.Duration`. Taking a possibly signed sequence of decimal numbers, each optional fraction and a unit suffix, such `300ms`, `-1.5h` or `2h45m`.
diff --git a/docs/registries/regexp.md b/docs/registries/regexp.md
index cf5326a..7cd9504 100644
--- a/docs/registries/regexp.md
+++ b/docs/registries/regexp.md
@@ -125,3 +125,72 @@ The function returns a version of the provided string that can be used as a lite
 {% endtab %}
 {% endtabs %}
 
+### <mark style="color:purple;">regexFindGroups</mark>
+
+The function finds the first match of a regex pattern in a string and returns the matched groups, with error handling.
+
+<table data-header-hidden><thead><tr><th width="164">Name</th><th>Value</th></tr></thead><tbody><tr><td>Signature</td><td><pre class="language-go"><code class="lang-go">RegexFindGroups(regex string, str string) ([]string, error)
+</code></pre></td></tr></tbody></table>
+
+{% tabs %}
+{% tab title="Template Example" %}
+```go
+{{ "aaabbb" | regexFindGroups "(a+)(b+)" }} // Output: ["aaabbb", "aaa", "bbb"], nil
+{{ "aaabbb" | regexFindGroups "\invalid$^///" }} // Error
+```
+{% endtab %}
+{% endtabs %}
+
+### <mark style="color:purple;">regexFindAllGroups</mark>
+
+The function finds all matches of a regex pattern in a string up to a specified limit and returns the matched groups, with error handling.
+
+<table data-header-hidden><thead><tr><th width="164">Name</th><th>Value</th></tr></thead><tbody><tr><td>Signature</td><td><pre class="language-go"><code class="lang-go">RegexFindAllGroups(regex string, n int, str string) ([]string, error)
+</code></pre></td></tr></tbody></table>
+
+{% tabs %}
+{% tab title="Template Example" %}
+```go
+{{ "aaabbb aab aaabbb" | regexFindAllGroups "(a+)(b+)", -1 }} // Output: [["aaabbb", "aaa", "bbb"], ["aab", "aa", "b"], ["aaabbb", "aaa", "bbb"]], nil
+{{ "aaabbb aab aaabbb" | regexFindAllGroups "(a+)(b+)", 1 }} // Output: [["aaabbb", "aaa", "bbb"]], nil
+{{ "aaabbb" | regexFindAllGroups "\invalid$^///" }} // Error
+```
+{% endtab %}
+{% endtabs %}
+
+### <mark style="color:purple;">regexFindNamed</mark>
+
+The function finds the first match of a regex pattern with named capturing groups in a string and returns a map of group names to matched strings, with error handling.
+
+<table data-header-hidden><thead><tr><th width="164">Name</th><th>Value</th></tr></thead><tbody><tr><td>Signature</td><td><pre class="language-go"><code class="lang-go">RegexFindNamed(regex string, str string) (map[string]string, error)
+</code></pre></td></tr></tbody></table>
+
+{% tabs %}
+{% tab title="Template Example" %}
+```go
+{{ "aaabbb" | regexFindNamed "(?P<first>a+)(?P<second>b+)" }} // Output: map["first":"aaa", "second":"bbb"], nil
+{{ "aaabbb" | regexFindNamed "(?P<first>a+)(b+)" }} // Output: map["first":"aaa"], nil
+{{ "bbb" | regexFindNamed "(?P<first>a+)" }} // Output: map[], nil
+{{ "aaabbb" | regexFindNamed "\invalid$^///" }} // Error
+```
+{% endtab %}
+{% endtabs %}
+
+### <mark style="color:purple;">regexFindAllNamed</mark>
+
+The function finds all matches of a regex pattern with named capturing groups in a string up to a specified limit and returns a slice of maps of group names to matched strings, with error handling.
+
+<table data-header-hidden><thead><tr><th width="164">Name</th><th>Value</th></tr></thead><tbody><tr><td>Signature</td><td><pre class="language-go"><code class="lang-go">RegexFindAllNamed(regex string, n int, str string) ([]map[string]string, error)
+</code></pre></td></tr></tbody></table>
+
+{% tabs %}
+{% tab title="Template Example" %}
+```go
+{{ "var1=value1&var2=value2" | regexFindAllNamed "(?P<param>\\w+)=(?P<value>\\w+)" -1 }} // Output: [map[param:var1 value:value1] map[param:var2 value:value2]], nil
+{{ "var1=value1&var2=value2" | regexFindAllNamed "(?P<param>\\w+)=(?P<value>\\w+)" 1 }} // Output: [map[param:var1 value:value1]], nil
+{{ "var1+value1" | regexFindAllNamed "(?P<param>\\w+)=(?P<value>\\w+)" -1 }} // Output: map[], nil
+{{ "var1=value1" | regexFindAllNamed "\invalid$^///" -1 }} // Error
+```
+{% endtab %}
+{% endtabs %}
+
diff --git a/docs/registries/slices.md b/docs/registries/slices.md
index 6f6a76a..604089f 100644
--- a/docs/registries/slices.md
+++ b/docs/registries/slices.md
@@ -127,6 +127,40 @@ The function removes `nil` and zero-value elements from a list, leaving only non
 {% endtab %}
 {% endtabs %}
 
+### <mark style="color:purple;">flatten</mark>
+
+The function flattens a list into a single-dimensional array, removing nested lists andcombining all elements into a single list.
+
+<table data-header-hidden><thead><tr><th width="164">Name</th><th>Value</th></tr></thead><tbody><tr><td>Signature</td><td><pre class="language-go"><code class="lang-go">Flatten(list any) ([]any, error)
+</code></pre></td></tr></tbody></table>
+
+{% tabs %}
+{% tab title="Template Example" %}
+```go
+{{ flatten [[1, 2], [3, 4], 5] }} // Output: [1, 2, 3, 4, 5]
+{{ flatten [[1, [2]], [3, 4], 5] }} // Output: [1, 2, 3, 4, 5]
+{{ nil | flatten }} // Error
+```
+{% endtab %}
+{% endtabs %}
+
+### <mark style="color:purple;">flattenDepth</mark>
+
+The function flattens a list into a single-dimensional array up to a specified depth, removing nested lists and combining all elements into a single list up to the specified depth.
+
+<table data-header-hidden><thead><tr><th width="164">Name</th><th>Value</th></tr></thead><tbody><tr><td>Signature</td><td><pre class="language-go"><code class="lang-go">FlattenDepth(deep int, list any) ([]any, error)
+</code></pre></td></tr></tbody></table>
+
+{% tabs %}
+{% tab title="Template Example" %}
+```go
+{{ [[1, [2]], [3, [4]], 5] | flattenDepth -1 }} // Output: [1, 2, 3, 4, 5]
+{{ [[1, [2]], [3, [4]], 5] | flattenDepth 1 }} // Output: [1, [2], 3, [4], 5]
+{{ nil | flattenDepth }} // Error
+```
+{% endtab %}
+{% endtabs %}
+
 ### <mark style="color:purple;">slice</mark>
 
 The function extracts a portion of a list, creating a new slice based on the specified start and end indices.
diff --git a/docs/roadmap-to-sprout-v1.0.md b/docs/roadmap-to-sprout-v1.0.md
index f39fbf4..2c6a316 100644
--- a/docs/roadmap-to-sprout-v1.0.md
+++ b/docs/roadmap-to-sprout-v1.0.md
@@ -111,5 +111,5 @@ This page will be updated each time function are re-implemented correctly in Spr
 
 A list of functions wanted for v1 based on issues, pull requests from sprig, feedback on sprout. All functions listed here will be implemented for the v1.
 
-<table><thead><tr><th width="94" data-type="checkbox">DONE</th><th>Functions</th><th>Description</th></tr></thead><tbody><tr><td>true</td><td><code>toYaml</code></td><td>Convert a struct to a YAML String</td></tr><tr><td>true</td><td><code>fromYaml</code></td><td>Convert YAML String to a struct</td></tr><tr><td>true</td><td><code>toBool</code></td><td>Convert any to a boolean</td></tr><tr><td>true</td><td><code>toDuration</code></td><td>Convert any to a <code>time.Duration</code></td></tr><tr><td>true</td><td><code>default</code>,<code>empty</code>,<code>coalesce</code></td><td>Dont trigger default go value as false</td></tr><tr><td>true</td><td><code>dig</code></td><td>Dig into a map without crashes in format <code>book.author.name</code></td></tr><tr><td>true</td><td><code>sha512sum</code></td><td>Support of SHA512</td></tr><tr><td>true</td><td><code>md5sum</code></td><td>Support of md5 hash</td></tr><tr><td>true</td><td><code>hasField</code></td><td>Detect if a field are present in an object using reflect. <a href="https://github.com/Masterminds/sprig/issues/401">Source</a></td></tr><tr><td>true</td><td><code>toDuration</code></td><td>convert a value to a <code>time.Duration</code></td></tr><tr><td>true</td><td><code>toCamelCase</code>, <code>toPascalCase</code>, <code>toKebakCase</code>, <code>toDotCase</code>, <code>topathCase</code>, <code>toConstantCase</code>,<code>toSnakeCase</code>,<code>toTitleCase</code></td><td>A batch of functions to change casing of a string to aby casing you want.</td></tr><tr><td>true</td><td><code>capitalize</code>, <code>uncapitalize</code></td><td>Capitalize / Uncapitalize a string (Upper/lower only the first character)</td></tr><tr><td>false</td><td><code>flatten</code></td><td>Flatten nested list be one level</td></tr><tr><td>false</td><td><code>regexpFindSubmatch</code>, <code>regexpAllSubmatches</code>,<code>regexpFindNamedSubmatch</code>, <code>regexpAllNamedSubmatches</code></td><td>Collection of function to found and retrieve submatches and named submatches</td></tr><tr><td>false</td><td><code>cidrhost</code>,<code>cidrnetmask</code>,<code>cidrsubnet</code>,<code>cidrsubnets</code></td><td>A collection of functions for network ip manipulation</td></tr><tr><td>false</td><td><code>toLocalDate</code></td><td>Convert to a <code>time.Time</code> with a timezone support</td></tr></tbody></table>
+<table><thead><tr><th width="94" data-type="checkbox">DONE</th><th>Functions</th><th>Description</th></tr></thead><tbody><tr><td>true</td><td><code>toYaml</code></td><td>Convert a struct to a YAML String</td></tr><tr><td>true</td><td><code>fromYaml</code></td><td>Convert YAML String to a struct</td></tr><tr><td>true</td><td><code>toBool</code></td><td>Convert any to a boolean</td></tr><tr><td>true</td><td><code>toDuration</code></td><td>Convert any to a <code>time.Duration</code></td></tr><tr><td>true</td><td><code>default</code>,<code>empty</code>,<code>coalesce</code></td><td>Dont trigger default go value as false</td></tr><tr><td>true</td><td><code>dig</code></td><td>Dig into a map without crashes in format <code>book.author.name</code></td></tr><tr><td>true</td><td><code>sha512sum</code></td><td>Support of SHA512</td></tr><tr><td>true</td><td><code>md5sum</code></td><td>Support of md5 hash</td></tr><tr><td>true</td><td><code>hasField</code></td><td>Detect if a field are present in an object using reflect. <a href="https://github.com/Masterminds/sprig/issues/401">Source</a></td></tr><tr><td>true</td><td><code>toDuration</code></td><td>convert a value to a <code>time.Duration</code></td></tr><tr><td>true</td><td><code>toCamelCase</code>, <code>toPascalCase</code>, <code>toKebakCase</code>, <code>toDotCase</code>, <code>topathCase</code>, <code>toConstantCase</code>,<code>toSnakeCase</code>,<code>toTitleCase</code></td><td>A batch of functions to change casing of a string to aby casing you want.</td></tr><tr><td>true</td><td><code>capitalize</code>, <code>uncapitalize</code></td><td>Capitalize / Uncapitalize a string (Upper/lower only the first character)</td></tr><tr><td>true</td><td><code>flatten</code></td><td>Flatten nested list be one level</td></tr><tr><td>true</td><td><code>regexpFindSubmatch</code>, <code>regexpAllSubmatches</code>,<code>regexpFindNamedSubmatch</code>, <code>regexpAllNamedSubmatches</code></td><td>Collection of function to found and retrieve submatches and named submatches</td></tr><tr><td>false</td><td><code>cidrhost</code>,<code>cidrnetmask</code>,<code>cidrsubnet</code>,<code>cidrsubnets</code></td><td>A collection of functions for network ip manipulation</td></tr><tr><td>true</td><td><code>toLocalDate</code></td><td>Convert to a <code>time.Time</code> with a timezone support</td></tr></tbody></table>
 
diff --git a/registry/conversion/conversion.go b/registry/conversion/conversion.go
index 589ed2d..ffb7c2a 100644
--- a/registry/conversion/conversion.go
+++ b/registry/conversion/conversion.go
@@ -32,6 +32,7 @@ func (cr *ConversionRegistry) RegisterFunctions(funcsMap sprout.FunctionMap) err
 	sprout.AddFunction(funcsMap, "toOctal", cr.ToOctal)
 	sprout.AddFunction(funcsMap, "toString", cr.ToString)
 	sprout.AddFunction(funcsMap, "toDate", cr.ToDate)
+	sprout.AddFunction(funcsMap, "toLocalDate", cr.ToLocalDate)
 	sprout.AddFunction(funcsMap, "toDuration", cr.ToDuration)
 	return nil
 }
diff --git a/registry/conversion/functions.go b/registry/conversion/functions.go
index 66929bc..17265fc 100644
--- a/registry/conversion/functions.go
+++ b/registry/conversion/functions.go
@@ -180,11 +180,36 @@ func (cr *ConversionRegistry) ToString(v any) string {
 //
 // Example:
 //
-//	{{ "2006-01-02", "2023-05-04" | toDate }} // Output: 2023-05-04 00:00:00 +0000 UTC
+//	{{ "2023-05-04" | toDate "2006-01-02" }} // Output: 2023-05-04 00:00:00 +0000 UTC
 func (cr *ConversionRegistry) ToDate(fmt, str string) (time.Time, error) {
 	return time.ParseInLocation(fmt, str, time.Local)
 }
 
+// ToLocalDate converts a string to a time.Time object based on a format specification
+// and the local timezone.
+//
+// Parameters:
+//
+//	fmt string - the date format string.
+//	str string - the date string to parse.
+//
+// Returns:
+//
+//	time.Time - the parsed date.
+//	error - error if the date string does not conform to the format.
+//
+// Example:
+//
+//	{{ "2023-05-04" | toLocalDate "2006-01-02" "Europe/Paris" }} // Output: 2023-05-04 00:00:00 +0200 UTC
+func (cr *ConversionRegistry) ToLocalDate(fmt, timezone, str string) (time.Time, error) {
+	location, err := time.LoadLocation(timezone)
+	if err != nil {
+		return time.Time{}, err
+	}
+
+	return time.ParseInLocation(fmt, str, location)
+}
+
 // ToDuration converts a value to a time.Duration.
 //
 // Parameters:
diff --git a/registry/regexp/functions.go b/registry/regexp/functions.go
index b240d07..e5ce842 100644
--- a/registry/regexp/functions.go
+++ b/registry/regexp/functions.go
@@ -163,3 +163,139 @@ func (rr *RegexpRegistry) RegexReplaceAllLiteral(regex string, s string, replace
 	}
 	return r.ReplaceAllLiteralString(s, replacedBy), nil
 }
+
+// RegexFindGroups finds the first match of a regex pattern in a string and
+// returns the matched groups, with error handling.
+//
+// Parameters:
+//
+//	regex string - the regular expression to search with.
+//	str string - the string to search within.
+//
+// Returns:
+//
+//	[]string - the matched groups from the first regex match found.
+//	error - error if the regex fails to compile.
+//
+// Example:
+//
+//	{{ "aaabbb" | regexFindGroups "(a+)(b+)" }} // Output: ["aaabbb", "aaa", "bbb"], nil
+func (rr *RegexpRegistry) RegexFindGroups(regex string, str string) ([]string, error) {
+	r, err := regexp.Compile(regex)
+	if err != nil {
+		return []string{}, err
+	}
+	matches := r.FindStringSubmatch(str)
+	if len(matches) == 0 {
+		return []string{}, nil
+	}
+	return matches, nil
+}
+
+// RegexFindAllGroups finds all matches of a regex pattern in a string up
+// to a specified limit and returns the matched groups, with error handling.
+//
+// Parameters:
+//
+//	regex string - the regular expression to search with.
+//	str string - the string to search within.
+//	n int - the maximum number of matches to return; use -1 for no limit.
+//
+// Returns:
+//
+//	[][]string - a slice containing the matched groups for each match found.
+//	error - error if the regex fails to compile.
+//
+// Example:
+//
+//	{{ "aaabbb aab aaabbb" | regexFindAllGroups "(a+)(b+)" -1 }} // Output: [["aaabbb", "aaa", "bbb"], ["aab", "aa", "b"], ["aaabbb", "aaa", "bbb"]], nil
+func (rr *RegexpRegistry) RegexFindAllGroups(regex string, n int, str string) ([][]string, error) {
+	r, err := regexp.Compile(regex)
+	if err != nil {
+		return [][]string{}, err
+	}
+	matches := r.FindAllStringSubmatch(str, n)
+	if len(matches) == 0 {
+		return [][]string{}, nil
+	}
+	return matches, nil
+}
+
+// RegexFindNamed finds the first match of a regex pattern with named
+// capturing groups in a string and returns a map of group names to matched
+// strings, with error handling.
+//
+// Parameters:
+//
+//	regex string - the regular expression to search with, containing named capturing groups.
+//	str string - the string to search within.
+//
+// Returns:
+//
+//	map[string]string - a map of group names to their corresponding matched strings.
+//	error - error if the regex fails to compile.
+//
+// Example:
+//
+//	{{ "aaabbb" | regexFindNamed "(?P<first>a+)(?P<second>b+)" }} // Output: map["first":"aaa", "second":"bbb"], nil
+func (rr *RegexpRegistry) RegexFindNamed(regex string, str string) (map[string]string, error) {
+	r, err := regexp.Compile(regex)
+	if err != nil {
+		return map[string]string{}, err
+	}
+	matches := r.FindStringSubmatch(str)
+	if len(matches) == 0 {
+		return map[string]string{}, nil
+	}
+
+	result := make(map[string]string, len(r.SubexpNames())-1)
+	for i, name := range r.SubexpNames() {
+		if i != 0 && name != "" {
+			result[name] = matches[i]
+		}
+	}
+	return result, nil
+}
+
+// RegexFindAllNamed finds all matches of a regex pattern with named capturing
+// groups in a string up to a specified limit and returns a slice of maps of
+// group names to matched strings, with error handling.
+//
+// Parameters:
+//
+//	regex string - the regular expression to search with, containing named capturing groups.
+//	str string - the string to search within.
+//	n int - the maximum number of matches to return; use -1 for no limit.
+//
+// Returns:
+//
+//	[]map[string]string - a slice containing a map of group names to their corresponding matched strings for each match found.
+//	error - error if the regex fails to compile.
+//
+// Example:
+//
+//	{{ "aaabbb aab aaabbb" | regexFindAllNamed "(?P<first>a+)(?P<second>b+)" -1 }} // Output: [map["first":"aaa", "second":"bbb"], map["first":"aa", "second":"b"], map["first":"aaa", "second":"bbb"]], nil
+func (rr *RegexpRegistry) RegexFindAllNamed(regex string, n int, str string) ([]map[string]string, error) {
+	r, err := regexp.Compile(regex)
+	if err != nil {
+		return []map[string]string{}, err
+	}
+	matches := r.FindAllStringSubmatch(str, n)
+	if len(matches) == 0 {
+		return []map[string]string{}, nil
+	}
+
+	subexpNames := r.SubexpNames()
+	results := make([]map[string]string, 0, len(matches))
+
+	for _, match := range matches {
+		m := make(map[string]string, len(subexpNames))
+		for i, name := range subexpNames {
+			if i != 0 && name != "" {
+				m[name] = match[i]
+			}
+		}
+		results = append(results, m)
+	}
+	return results, nil
+}
diff --git a/registry/regexp/regexp.go b/registry/regexp/regexp.go
index 5e2720f..258de73 100644
--- a/registry/regexp/regexp.go
+++ b/registry/regexp/regexp.go
@@ -31,6 +31,10 @@ func (rr *RegexpRegistry) RegisterFunctions(funcsMap sprout.FunctionMap) error {
 	sprout.AddFunction(funcsMap, "regexReplaceAll", rr.RegexReplaceAll)
 	sprout.AddFunction(funcsMap, "regexReplaceAllLiteral", rr.RegexReplaceAllLiteral)
 	sprout.AddFunction(funcsMap, "regexQuoteMeta", rr.RegexQuoteMeta)
+	sprout.AddFunction(funcsMap, "regexFindGroups", rr.RegexFindGroups)
+	sprout.AddFunction(funcsMap, "regexFindAllGroups", rr.RegexFindAllGroups)
+	sprout.AddFunction(funcsMap, "regexFindNamed", rr.RegexFindNamed)
+	sprout.AddFunction(funcsMap, "regexFindAllNamed", rr.RegexFindAllNamed)
 	return nil
 }
 
diff --git a/registry/slices/functions.go b/registry/slices/functions.go
index 3e9d149..2c698c3 100644
--- a/registry/slices/functions.go
+++ b/registry/slices/functions.go
@@ -344,6 +344,56 @@ func (sr *SlicesRegistry) Compact(list any) ([]any, error) {
 	}
 }
 
+// Flatten flattens a nested list into a single list of elements.
+//
+// Parameters:
+//
+//	list any - the list to flatten.
+//
+// Returns:
+//
+//	[]any - the flattened list.
+//	error - error if the list is nil or not a slice/array.
+//
+// Example:
+//
+//	{{ flatten [[1, 2], [3, 4], 5] }} // Output: [1, 2, 3, 4, 5]
+func (sr *SlicesRegistry) Flatten(list any) ([]any, error) {
+	return sr.FlattenDepth(-1, list)
+}
+
+// FlattenDepth flattens a nested list into a single list of elements up to a
+// specified depth.
+//
+// Parameters:
+//
+//	deep int - the maximum depth to flatten to; -1 for infinite depth.
+//	list any - the list to flatten.
+//
+// Returns:
+//
+//	[]any - the flattened list.
+//	error - error if the list is nil or not a slice/array.
+//
+// Example:
+//
+//	{{ [[1, 2, [3], 4], 5] | flattenDepth 1 }} // Output: [1, 2, [3], 4, 5]
+func (sr *SlicesRegistry) FlattenDepth(deep int, list any) ([]any, error) {
+	if list == nil {
+		return nil, fmt.Errorf("cannot flatten nil")
+	}
+
+	valueOfList := reflect.ValueOf(list)
+	tp := valueOfList.Kind()
+
+	switch tp {
+	case reflect.Slice, reflect.Array:
+		return sr.flattenSlice(valueOfList, deep), nil
+	default:
+		return nil, fmt.Errorf("cannot flatten on type %s", tp)
+	}
+}
+
 // Slice extracts a slice from a list between two indices.
 //
 // Parameters:
diff --git a/registry/slices/helpers.go b/registry/slices/helpers.go
index 77305f4..5d078a4 100644
--- a/registry/slices/helpers.go
+++ b/registry/slices/helpers.go
@@ -1,6 +1,8 @@
 package slices
 
-import "reflect"
+import (
+	"reflect"
+)
 
 // inList checks if a value is in a slice of any type by comparing values.
 func (sr *SlicesRegistry) inList(haystack []any, needle any) bool {
@@ -26,3 +28,24 @@ func (sr *SlicesRegistry) isComparable(v any) bool {
 		return false
 	}
 }
+
+// flattenSlice recursively flattens a slice of slices into a single slice.
+// It is used by the Flatten function.
+func (sr *SlicesRegistry) flattenSlice(val reflect.Value, remainingDeep int) []any {
+	result := make([]any, 0, val.Len())
+	for i := 0; i < val.Len(); i++ {
+		item := val.Index(i)
+
+		if item.Kind() == reflect.Interface {
+			item = item.Elem()
+		}
+
+		if (item.Kind() == reflect.Slice || item.Kind() == reflect.Array) && (remainingDeep > 0 || remainingDeep <= -1) {
+			result = append(result, sr.flattenSlice(item, remainingDeep-1)...)
+		} else {
+			result = append(result, item.Interface())
+		}
+	}
+
+	return result
+}
diff --git a/registry/slices/slices.go b/registry/slices/slices.go
index dd9ff84..fce7146 100644
--- a/registry/slices/slices.go
+++ b/registry/slices/slices.go
@@ -31,6 +31,8 @@ func (sr *SlicesRegistry) RegisterFunctions(funcsMap sprout.FunctionMap) error {
 	sprout.AddFunction(funcsMap, "chunk", sr.Chunk)
 	sprout.AddFunction(funcsMap, "uniq", sr.Uniq)
 	sprout.AddFunction(funcsMap, "compact", sr.Compact)
+	sprout.AddFunction(funcsMap, "flatten", sr.Flatten)
+	sprout.AddFunction(funcsMap, "flattenDepth", sr.FlattenDepth)
 	sprout.AddFunction(funcsMap, "slice", sr.Slice)
 	sprout.AddFunction(funcsMap, "has", sr.Has)
 	sprout.AddFunction(funcsMap, "without", sr.Without)


Test patch:
diff --git a/benchmarks/comparaison_test.go b/benchmarks/comparaison_test.go
index ba627b0..c9de91f 100644
--- a/benchmarks/comparaison_test.go
+++ b/benchmarks/comparaison_test.go
@@ -152,7 +152,6 @@ func sproutBench(templatePath string) {
 	)
 
 	tmpl, err := template.New("allFunctions").Funcs(fnHandler.Build()).ParseGlob(templatePath)
-
 	if err != nil {
 		panic(err)
 	}
diff --git a/registry/conversion/functions_test.go b/registry/conversion/functions_test.go
index 7ac0117..fb040b0 100644
--- a/registry/conversion/functions_test.go
+++ b/registry/conversion/functions_test.go
@@ -150,6 +150,43 @@ func TestToDate(t *testing.T) {
 	pesticide.RunTestCases(t, conversion.NewRegistry(), tc)
 }
 
+func TestToLocalDate(t *testing.T) {
+	tc := []pesticide.TestCase{
+		{
+			Name:           "TestLocalDate",
+			Input:          `{{$v := toLocalDate "2006-01-02" "Europe/Paris" .V }}{{typeOf $v}}-{{$v}}`,
+			Data:           map[string]any{"V": "2024-05-09"},
+			ExpectedOutput: "time.Time-2024-05-09 00:00:00 +0200 CEST",
+		},
+		{
+			Name:           "TestLocalDate",
+			Input:          `{{$v := toLocalDate "2006-01-02 15:04:05 MST" "MST" .V }}{{typeOf $v}}-{{$v}}`,
+			Data:           map[string]any{"V": "2024-05-09 00:00:00 MST"},
+			ExpectedOutput: "time.Time-2024-05-09 00:00:00 -0700 MST",
+		},
+		{
+			Name:        "TestInvalidValue",
+			Input:       `{{$v := toLocalDate "2006-01-02" "UTC" .V }}{{typeOf $v}}-{{$v}}`,
+			Data:        map[string]any{"V": ""},
+			ExpectedErr: "cannot parse \"\" as \"2006\"",
+		},
+		{
+			Name:        "TestInvalidLayout",
+			Input:       `{{$v := toLocalDate "invalid" "UTC" .V }}{{typeOf $v}}-{{$v}}`,
+			Data:        map[string]any{"V": "2024-05-09"},
+			ExpectedErr: "cannot parse \"2024-05-09\" as \"invalid\"",
+		},
+		{
+			Name:        "TestInvalidTimezone",
+			Input:       `{{$v := toLocalDate "2006-01-02" "invalid" .V }}{{typeOf $v}}-{{$v}}`,
+			Data:        map[string]any{"V": "2024-05-09"},
+			ExpectedErr: "unknown time zone invalid",
+		},
+	}
+
+	pesticide.RunTestCases(t, conversion.NewRegistry(), tc)
+}
+
 func TestToDuration(t *testing.T) {
 	tc := []pesticide.TestCase{
 		{Name: "TestInt", Input: `{{$v := toDuration .V }}{{typeOf $v}}-{{$v}}`, ExpectedOutput: "time.Duration-1ns", Data: map[string]any{"V": 1}},
diff --git a/registry/filesystem/filesystem_functions_windows_test.go b/registry/filesystem/filesystem_functions_windows_test.go
index eff9ab3..6c4ae1c 100644
--- a/registry/filesystem/filesystem_functions_windows_test.go
+++ b/registry/filesystem/filesystem_functions_windows_test.go
@@ -8,7 +8,7 @@ import (
 )
 
 func TestOsBase(t *testing.T) {
-	var tc = []pesticide.TestCase{
+	tc := []pesticide.TestCase{
 		{Name: "TestEmptyPath", Input: `{{ osBase "" }}`, ExpectedOutput: "."},
 		{Name: "TestRootPath", Input: `{{ osBase "D:\\" }}`, ExpectedOutput: "\\"},
 		{Name: "TestWithoutExtension", Input: `{{ osBase "D:\\path\\to\\file" }}`, ExpectedOutput: "file"},
@@ -21,7 +21,7 @@ func TestOsBase(t *testing.T) {
 }
 
 func TestOsDir(t *testing.T) {
-	var tc = []pesticide.TestCase{
+	tc := []pesticide.TestCase{
 		{Name: "TestEmptyPath", Input: `{{ osDir "" }}`, ExpectedOutput: "."},
 		{Name: "TestRootPath", Input: `{{ osDir "D:\\" }}`, ExpectedOutput: "D:\\"},
 		{Name: "TestWithoutExtension", Input: `{{ osDir "D:\\path\\to\\file" }}`, ExpectedOutput: "D:\\path\\to"},
@@ -34,7 +34,7 @@ func TestOsDir(t *testing.T) {
 }
 
 func TestOsExt(t *testing.T) {
-	var tc = []pesticide.TestCase{
+	tc := []pesticide.TestCase{
 		{Name: "TestEmptyPath", Input: `{{ osExt "" }}`, ExpectedOutput: ""},
 		{Name: "TestRootPath", Input: `{{ osExt "\\" }}`, ExpectedOutput: ""},
 		{Name: "TestWithoutExtension", Input: `{{ osExt "D:\\path\\to\\file" }}`, ExpectedOutput: ""},
@@ -47,7 +47,7 @@ func TestOsExt(t *testing.T) {
 }
 
 func TestOsClean(t *testing.T) {
-	var tc = []pesticide.TestCase{
+	tc := []pesticide.TestCase{
 		{Name: "TestEmptyPath", Input: `{{ osClean "" }}`, ExpectedOutput: "."},
 		{Name: "TestRootPath", Input: `{{ osClean "D:\\" }}`, ExpectedOutput: "D:\\"},
 		{Name: "TestWithoutExtension", Input: `{{ osClean "D:\\path\\\\to\\file" }}`, ExpectedOutput: "D:\\path\\to\\file"},
@@ -57,7 +57,7 @@ func TestOsClean(t *testing.T) {
 }
 
 func TestOsIsAbs(t *testing.T) {
-	var tc = []pesticide.TestCase{
+	tc := []pesticide.TestCase{
 		{Name: "TestEmptyPath", Input: `{{ osIsAbs "" }}`, ExpectedOutput: "false"},
 		{Name: "TestRootPath", Input: `{{ osIsAbs "D:\\" }}`, ExpectedOutput: "true"},
 		{Name: "TestRelativePath", Input: `{{ osIsAbs "path\\to\\file" }}`, ExpectedOutput: "false"},
diff --git a/registry/regexp/functions_test.go b/registry/regexp/functions_test.go
index f6a7d4f..249f1cb 100644
--- a/registry/regexp/functions_test.go
+++ b/registry/regexp/functions_test.go
@@ -278,3 +278,106 @@ func TestMustRegexReplaceAllLiteral(t *testing.T) {
 
 	pesticide.RunTestCases(t, regexp.NewRegistry(), tc)
 }
+
+func TestRegexFindNamed(t *testing.T) {
+	tc := []pesticide.TestCase{
+		{
+			Name:           "TestRegexFindNamedValid",
+			Input:          `{{ .V | regexFindNamed "(?P<username>[A-Za-z]+)@(?P<domain>example\\.com)" }}`,
+			Data:           map[string]any{"V": "Contact us at noreply@example.com"},
+			ExpectedOutput: "map[domain:example.com username:noreply]",
+		},
+		{
+			Name:           "TestRegexpFindNamedWithUnnamedGroup",
+			Input:          `{{ .V | regexFindNamed "(?P<username>[A-Za-z]+)@(example\\.com)" }}`,
+			Data:           map[string]any{"V": "Contact us at noreply@example.com"},
+			ExpectedOutput: "map[username:noreply]",
+		},
+		{
+			Name:           "TestRegexFindNamedNoMatch",
+			Input:          `{{ .V | regexFindNamed "(?P<username>[A-Za-z]+)@(?P<domain>example\\.org)" }}`,
+			Data:           map[string]any{"V": "Contact us at noreply@example.com"},
+			ExpectedOutput: "map[]",
+		},
+		{
+			Name:        "TestRegexFindNamedInvalidPattern",
+			Input:       `{{ .V | regexFindNamed "(?P<username>[A-Za-z]+)@(?P<domain>example\\.com" }}`,
+			Data:        map[string]any{"V": "Contact us at noreply@example.com"},
+			ExpectedErr: "error parsing regexp",
+		},
+	}
+	pesticide.RunTestCases(t, regexp.NewRegistry(), tc)
+}
+
+func TestRegexFindAllNamed(t *testing.T) {
+	tc := []pesticide.TestCase{
+		{
+			Name:           "TestRegexFindAllNamedValid",
+			Input:          `{{ regexFindAllNamed "(?P<param>\\w+)=(?P<value>\\w+)" -1 "var1=value1&var2=value2&var3=value3" }}`,
+			ExpectedOutput: "[map[param:var1 value:value1] map[param:var2 value:value2] map[param:var3 value:value3]]",
+		},
+		{
+			Name:           "TestRegexFindAllNamedWithLimit",
+			Input:          `{{ regexFindAllNamed "(?P<param>\\w+)=(?P<value>\\w+)" 2 "var1=value1&var2=value2&var3=value3" }}`,
+			ExpectedOutput: "[map[param:var1 value:value1] map[param:var2 value:value2]]",
+		},
+		{
+			Name:           "TestRegexFindAllNamedNoMatch",
+			Input:          `{{ regexFindAllNamed "(?P<param>\\d+)=(?P<value>\\d+)" -1 "var1=value1&var2=value2&var3=value3" }}`,
+			ExpectedOutput: "[]",
+		},
+		{
+			Name:        "TestRegexFindAllNamedInvalidPattern",
+			Input:       `{{ regexFindAllNamed "(?P<param>\\w+)=(?P<value>\\w+" -1 "var1=value1&var2=value2&var3=value3" }}`,
+			ExpectedErr: "error parsing regexp",
+		},
+	}
+	pesticide.RunTestCases(t, regexp.NewRegistry(), tc)
+}
+
+func TestRegexFindGroups(t *testing.T) {
+	tc := []pesticide.TestCase{
+		{
+			Name:           "TestRegexFindGroupsValid",
+			Input:          `{{ regexFindGroups "([A-Za-z]+)@(example\\.com)" "Contact us at support@example.com" }}`,
+			ExpectedOutput: "[support@example.com support example.com]",
+		},
+		{
+			Name:           "TestRegexFindGroupsNoMatch",
+			Input:          `{{ regexFindGroups "([A-Za-z]+)@(example\\.org)" "Contact us at support@example.com" }}`,
+			ExpectedOutput: "[]",
+		},
+		{
+			Name:        "TestRegexFindGroupsInvalidPattern",
+			Input:       `{{ regexFindGroups "([A-Za-z]+)@(example\\.com" "Contact us at support@example.com" }}`,
+			ExpectedErr: "error parsing regexp",
+		},
+	}
+	pesticide.RunTestCases(t, regexp.NewRegistry(), tc)
+}
+
+func TestRegexFindAllGroups(t *testing.T) {
+	tc := []pesticide.TestCase{
+		{
+			Name:           "TestRegexFindAllGroupsValid",
+			Input:          `{{ regexFindAllGroups "(\\w+)=(\\w+)" -1 "var1=value1&var2=value2&var3=value3" }}`,
+			ExpectedOutput: "[[var1=value1 var1 value1] [var2=value2 var2 value2] [var3=value3 var3 value3]]",
+		},
+		{
+			Name:           "TestRegexFindAllGroupsWithLimit",
+			Input:          `{{ regexFindAllGroups "(\\w+)=(\\w+)" 2 "var1=value1&var2=value2&var3=value3" }}`,
+			ExpectedOutput: "[[var1=value1 var1 value1] [var2=value2 var2 value2]]",
+		},
+		{
+			Name:           "TestRegexFindAllGroupsNoMatch",
+			Input:          `{{ regexFindAllGroups "(\\d+)=(\\d+)" -1 "var1=value1&var2=value2&var3=value3" }}`,
+			ExpectedOutput: "[]",
+		},
+		{
+			Name:        "TestRegexFindAllGroupsInvalidPattern",
+			Input:       `{{ regexFindAllGroups "(\\w+)=(\\w+" -1 "var1=value1&var2=value2&var3=value3" }}`,
+			ExpectedErr: "error parsing regexp",
+		},
+	}
+	pesticide.RunTestCases(t, regexp.NewRegistry(), tc)
+}
diff --git a/registry/slices/functions_test.go b/registry/slices/functions_test.go
index b1c50b4..888afe0 100644
--- a/registry/slices/functions_test.go
+++ b/registry/slices/functions_test.go
@@ -100,6 +100,32 @@ func TestCompact(t *testing.T) {
 	pesticide.RunTestCases(t, slices.NewRegistry(), tc)
 }
 
+func TestFlatten(t *testing.T) {
+	tc := []pesticide.TestCase{
+		{Input: `{{ flatten .V }}`, ExpectedOutput: "[a b c d e]", Data: map[string]any{"V": []any{"a", "b", []any{"c", "d"}, "e"}}},
+		{Input: `{{ flatten .V }}`, ExpectedOutput: "[a b c d e]", Data: map[string]any{"V": []any{"a", "b", []string{"c", "d"}, "e"}}},
+		{Input: `{{ flatten .V }}`, ExpectedOutput: "[a b 1 2 e]", Data: map[string]any{"V": []any{"a", "b", []int{1, 2}, "e"}}},
+		{Input: `{{ flatten .V }}`, ExpectedOutput: "[a b c d e]", Data: map[string]any{"V": []any{"a", "b", []any{"c", []any{"d"}}, "e"}}},
+		{Input: `{{ flatten .V }}`, ExpectedErr: "cannot flatten on type map", Data: map[string]any{"V": map[string]any{"a": 1}}},
+		{Input: `{{ flatten .V }}`, ExpectedErr: "cannot flatten nil", Data: map[string]any{"V": nil}},
+	}
+
+	pesticide.RunTestCases(t, slices.NewRegistry(), tc)
+}
+
+func TestFlattenDepth(t *testing.T) {
+	tc := []pesticide.TestCase{
+		{Input: `{{ flattenDepth 1 .V }}`, ExpectedOutput: "[a b c d e]", Data: map[string]any{"V": []any{"a", "b", []any{"c", "d"}, "e"}}},
+		{Input: `{{ flattenDepth 1 .V }}`, ExpectedOutput: "[a b c d e]", Data: map[string]any{"V": []any{"a", "b", []string{"c", "d"}, "e"}}},
+		{Input: `{{ flattenDepth 1 .V }}`, ExpectedOutput: "[a b 1 2 e]", Data: map[string]any{"V": []any{"a", "b", []int{1, 2}, "e"}}},
+		{Input: `{{ flattenDepth 1 .V }}`, ExpectedOutput: "[a b c [d] e]", Data: map[string]any{"V": []any{"a", "b", []any{"c", []any{"d"}}, "e"}}},
+		{Input: `{{ flattenDepth 1 .V }}`, ExpectedErr: "cannot flatten on type map", Data: map[string]any{"V": map[string]any{"a": 1}}},
+		{Input: `{{ flattenDepth 1 .V }}`, ExpectedErr: "cannot flatten nil", Data: map[string]any{"V": nil}},
+	}
+
+	pesticide.RunTestCases(t, slices.NewRegistry(), tc)
+}
+
 func TestSlice(t *testing.T) {
 	tc := []pesticide.TestCase{
 		{Input: `{{ .V | slice }}`, ExpectedOutput: "[a b c d e]", Data: map[string]any{"V": []string{"a", "b", "c", "d", "e"}}},
diff --git a/registry/slices/helpers_test.go b/registry/slices/helpers_test.go
index 74dcb8f..8f6c25f 100644
--- a/registry/slices/helpers_test.go
+++ b/registry/slices/helpers_test.go
@@ -2,6 +2,7 @@ package slices
 
 import (
 	"fmt"
+	"reflect"
 	"testing"
 	"time"
 
@@ -54,3 +55,43 @@ func TestSlicesRegistry_inList(t *testing.T) {
 	assert.True(t, r.inList(anyTest, testStruct{"c"}))
 	assert.False(t, r.inList(anyTest, testStruct{"d"}))
 }
+
+func TestSlicesRegistry_flattenSlice(t *testing.T) {
+	r := NewRegistry()
+
+	tc := []struct {
+		input    []any
+		depth    int
+		expected []any
+	}{
+		{
+			input:    []any{1, 2, 3, []any{4, 5, 6}, []any{7, 8, 9}},
+			depth:    1,
+			expected: []any{1, 2, 3, 4, 5, 6, 7, 8, 9},
+		},
+		{
+			input:    []any{1, 2, 3, []any{4, 5, 6}, []any{7, 8, 9}, []any{[]any{10, 11, 12}, 13, 14}},
+			depth:    2,
+			expected: []any{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14},
+		},
+		{
+			input:    []any{1, 2, 3, []any{4, 5, 6}, []any{7, 8, 9}, []any{[]any{10, 11, 12}, 13, 14}},
+			depth:    1,
+			expected: []any{1, 2, 3, 4, 5, 6, 7, 8, 9, []any{10, 11, 12}, 13, 14},
+		},
+		{
+			input:    []any{1, 2, 3, []any{4, 5, 6}, []any{7, 8, 9}, []any{[]any{10, 11, 12}, 13, 14}},
+			depth:    0,
+			expected: []any{1, 2, 3, []any{4, 5, 6}, []any{7, 8, 9}, []any{[]any{10, 11, 12}, 13, 14}},
+		},
+		{
+			input:    []any{1, 2, 3, []any{4, 5, 6}, []any{7, 8, 9}, []any{[]any{10, 11, 12}, 13, 14}},
+			depth:    -1,
+			expected: []any{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14},
+		},
+	}
+
+	for _, tt := range tc {
+		assert.Equal(t, tt.expected, r.flattenSlice(reflect.ValueOf(tt.input), tt.depth))
+	}
+}