Skip to content

Commit 0f5198e

Browse files
committed
Implement String.sliceUnits and fix String.getUnit
1 parent 8efa597 commit 0f5198e

File tree

5 files changed

+132
-111
lines changed

5 files changed

+132
-111
lines changed

devbox.lock

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -2,54 +2,54 @@
22
"lockfile_version": "1",
33
"packages": {
44
"github:NixOS/nixpkgs/nixpkgs-unstable": {
5-
"last_modified": "2025-09-21T09:21:16Z",
6-
"resolved": "github:NixOS/nixpkgs/a1f79a1770d05af18111fbbe2a3ab2c42c0f6cd0?lastModified=1758446476&narHash=sha256-5rdAi7CTvM%2FkSs6fHe1bREIva5W3TbImsto%2BdxG4mBo%3D"
5+
"last_modified": "2025-10-12T08:13:11Z",
6+
"resolved": "github:NixOS/nixpkgs/832e3b6db48508ae436c2c7bfc0cf914eac6938e?lastModified=1760256791&narHash=sha256-uTpzDHRASEDeFUuToWSQ46Re8beXyG9dx4W36FQa0%2Fc%3D"
77
},
88
9-
"last_modified": "2025-08-05T11:35:34Z",
10-
"resolved": "github:NixOS/nixpkgs/a683adc19ff5228af548c6539dbc3440509bfed3#gren",
9+
"last_modified": "2025-09-18T16:33:27Z",
10+
"resolved": "github:NixOS/nixpkgs/f4b140d5b253f5e2a1ff4e5506edbf8267724bde#gren",
1111
"source": "devbox-search",
12-
"version": "0.6.2",
12+
"version": "0.6.3",
1313
"systems": {
1414
"aarch64-darwin": {
1515
"outputs": [
1616
{
1717
"name": "out",
18-
"path": "/nix/store/1p0vb5l9vq8j9bhna05hzgzqygb05cjk-gren-0.6.2",
18+
"path": "/nix/store/clr249d9d9rlqs3fsgj2lb4m97ph2hms-gren-0.6.3",
1919
"default": true
2020
}
2121
],
22-
"store_path": "/nix/store/1p0vb5l9vq8j9bhna05hzgzqygb05cjk-gren-0.6.2"
22+
"store_path": "/nix/store/clr249d9d9rlqs3fsgj2lb4m97ph2hms-gren-0.6.3"
2323
},
2424
"aarch64-linux": {
2525
"outputs": [
2626
{
2727
"name": "out",
28-
"path": "/nix/store/vr3jccalhkhpsz53dpvx8sd9q2d2wy3s-gren-0.6.2",
28+
"path": "/nix/store/zgx86f6s63l0ckj78psmkdkwqfxr3770-gren-0.6.3",
2929
"default": true
3030
}
3131
],
32-
"store_path": "/nix/store/vr3jccalhkhpsz53dpvx8sd9q2d2wy3s-gren-0.6.2"
32+
"store_path": "/nix/store/zgx86f6s63l0ckj78psmkdkwqfxr3770-gren-0.6.3"
3333
},
3434
"x86_64-darwin": {
3535
"outputs": [
3636
{
3737
"name": "out",
38-
"path": "/nix/store/jdh0sfgc5144b2l7fwyq0qzax65pxgcx-gren-0.6.2",
38+
"path": "/nix/store/1gdj8kkrb5d945rklcxwqzl8s55kjpyx-gren-0.6.3",
3939
"default": true
4040
}
4141
],
42-
"store_path": "/nix/store/jdh0sfgc5144b2l7fwyq0qzax65pxgcx-gren-0.6.2"
42+
"store_path": "/nix/store/1gdj8kkrb5d945rklcxwqzl8s55kjpyx-gren-0.6.3"
4343
},
4444
"x86_64-linux": {
4545
"outputs": [
4646
{
4747
"name": "out",
48-
"path": "/nix/store/qqni6nqfjb1kw4qg7ad0hkvjrk78ir69-gren-0.6.2",
48+
"path": "/nix/store/xhc5c5vl8jxxm0jrr8vap34agz3f6yfi-gren-0.6.3",
4949
"default": true
5050
}
5151
],
52-
"store_path": "/nix/store/qqni6nqfjb1kw4qg7ad0hkvjrk78ir69-gren-0.6.2"
52+
"store_path": "/nix/store/xhc5c5vl8jxxm0jrr8vap34agz3f6yfi-gren-0.6.3"
5353
}
5454
}
5555
},
@@ -102,83 +102,83 @@
102102
}
103103
},
104104
"nodejs@20": {
105-
"last_modified": "2025-08-11T23:54:17Z",
105+
"last_modified": "2025-09-21T09:21:16Z",
106106
"plugin_version": "0.0.2",
107-
"resolved": "github:NixOS/nixpkgs/5a983011e0f4b3b286aaa73e011ce32b1449a528#nodejs_20",
107+
"resolved": "github:NixOS/nixpkgs/a1f79a1770d05af18111fbbe2a3ab2c42c0f6cd0#nodejs_20",
108108
"source": "devbox-search",
109-
"version": "20.19.4",
109+
"version": "20.19.5",
110110
"systems": {
111111
"aarch64-darwin": {
112112
"outputs": [
113113
{
114114
"name": "out",
115-
"path": "/nix/store/2xza7g9y47n717w43qdd1ikc0y10qh16-nodejs-20.19.4",
115+
"path": "/nix/store/c1i3piipnvl1jg8vv4jhgb8x0m032wxh-nodejs-20.19.5",
116116
"default": true
117117
},
118118
{
119119
"name": "dev",
120-
"path": "/nix/store/yvcblmgwq9md8f2mpw8ra2cf3b7jkm7b-nodejs-20.19.4-dev"
120+
"path": "/nix/store/2awbm76f2sr7s03g8n20h6nhm10ygykf-nodejs-20.19.5-dev"
121121
},
122122
{
123123
"name": "libv8",
124-
"path": "/nix/store/x5b5wq2qjfq9di05qlja0wd7ypqcnxc8-nodejs-20.19.4-libv8"
124+
"path": "/nix/store/mmd275vh5z761axp7aa86j6l6bpy5i1m-nodejs-20.19.5-libv8"
125125
}
126126
],
127-
"store_path": "/nix/store/2xza7g9y47n717w43qdd1ikc0y10qh16-nodejs-20.19.4"
127+
"store_path": "/nix/store/c1i3piipnvl1jg8vv4jhgb8x0m032wxh-nodejs-20.19.5"
128128
},
129129
"aarch64-linux": {
130130
"outputs": [
131131
{
132132
"name": "out",
133-
"path": "/nix/store/rpk03376gp4vrjrahx11ncr50ji6cvhw-nodejs-20.19.4",
133+
"path": "/nix/store/1cjddb0jcrdyfyv2b5r9jlqa57f54bm6-nodejs-20.19.5",
134134
"default": true
135135
},
136136
{
137137
"name": "dev",
138-
"path": "/nix/store/qai8hc7vnmxil2b9ab86gv2wrg5yx67q-nodejs-20.19.4-dev"
138+
"path": "/nix/store/3n6v93iaiwxdnxc3fa8v6zyrnzn6zq1d-nodejs-20.19.5-dev"
139139
},
140140
{
141141
"name": "libv8",
142-
"path": "/nix/store/4d388d34pvahifbini4a28wm1wzi9c6l-nodejs-20.19.4-libv8"
142+
"path": "/nix/store/fary15b8xxhfda7zzh0jpm9d3067nwmv-nodejs-20.19.5-libv8"
143143
}
144144
],
145-
"store_path": "/nix/store/rpk03376gp4vrjrahx11ncr50ji6cvhw-nodejs-20.19.4"
145+
"store_path": "/nix/store/1cjddb0jcrdyfyv2b5r9jlqa57f54bm6-nodejs-20.19.5"
146146
},
147147
"x86_64-darwin": {
148148
"outputs": [
149149
{
150150
"name": "out",
151-
"path": "/nix/store/x7ail2dy0fi3742yridnnk3hdlp16cls-nodejs-20.19.4",
151+
"path": "/nix/store/pdrrgvlm1ixpwhzzqcakfxhwry2fknv4-nodejs-20.19.5",
152152
"default": true
153153
},
154154
{
155155
"name": "dev",
156-
"path": "/nix/store/pcjlzxxfrgvw9pp0ir5v58h7n1al9xrn-nodejs-20.19.4-dev"
156+
"path": "/nix/store/c0kf2mhpgwn0f558frp73ci70srazgnz-nodejs-20.19.5-dev"
157157
},
158158
{
159159
"name": "libv8",
160-
"path": "/nix/store/zjmxxl948wyf7vczhz56rh6nmmysm6bl-nodejs-20.19.4-libv8"
160+
"path": "/nix/store/2lb6gxx66agqsxxigcljf2h98msczxhk-nodejs-20.19.5-libv8"
161161
}
162162
],
163-
"store_path": "/nix/store/x7ail2dy0fi3742yridnnk3hdlp16cls-nodejs-20.19.4"
163+
"store_path": "/nix/store/pdrrgvlm1ixpwhzzqcakfxhwry2fknv4-nodejs-20.19.5"
164164
},
165165
"x86_64-linux": {
166166
"outputs": [
167167
{
168168
"name": "out",
169-
"path": "/nix/store/l62aza10kx0xp1f235q2lbrzzqj5lcs9-nodejs-20.19.4",
169+
"path": "/nix/store/z83yrxjf8abxz2m0vf6ic8cbaqsil0kp-nodejs-20.19.5",
170170
"default": true
171171
},
172172
{
173173
"name": "dev",
174-
"path": "/nix/store/a73v659hn20f543z519cmm3vplah8pns-nodejs-20.19.4-dev"
174+
"path": "/nix/store/s2cz8r7qjan8lj5hbfpcvk8clynn23b3-nodejs-20.19.5-dev"
175175
},
176176
{
177177
"name": "libv8",
178-
"path": "/nix/store/5q0dhajwwv1pfwnkm79wphvgi19wi49c-nodejs-20.19.4-libv8"
178+
"path": "/nix/store/kxykq3pgpd5k57qrbjxhcapigrxj1zgj-nodejs-20.19.5-libv8"
179179
}
180180
],
181-
"store_path": "/nix/store/l62aza10kx0xp1f235q2lbrzzqj5lcs9-nodejs-20.19.4"
181+
"store_path": "/nix/store/z83yrxjf8abxz2m0vf6ic8cbaqsil0kp-nodejs-20.19.5"
182182
}
183183
}
184184
}

src/Gren/Kernel/String.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -268,9 +268,9 @@ var _String_unitLength = function (str) {
268268
};
269269

270270
var _String_getUnit = F2(function (index, str) {
271-
var ret = str.at(index);
271+
var char = str.at(index);
272272

273-
if (typeof ret === "undefined") {
273+
if (typeof char === "undefined") {
274274
return __Maybe_Nothing;
275275
}
276276

@@ -292,3 +292,7 @@ var _String_foldrUnits = F3(function (fn, state, str) {
292292

293293
return state;
294294
});
295+
296+
var _String_sliceUnits = F3(function (start, end, str) {
297+
return str.slice(start, end);
298+
});

src/String.gren

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ module String exposing
99
, toArray, fromArray
1010
, toUpper, toLower, pad, padLeft, padRight, trim, trimLeft, trimRight
1111
, map, keepIf, foldl, foldr, any, all
12-
, unitLength, getUnit, foldlUnits, foldrUnits
12+
, unitLength, getUnit, foldlUnits, foldrUnits, sliceUnits
1313
)
1414

1515
{-| A built-in representation for efficient string manipulation. When it comes to strings,
@@ -78,7 +78,7 @@ Cosmetic operations such as padding with extra characters or trimming whitespace
7878

7979
Functions that operates on units instead of code points.
8080

81-
@docs unitLength, getUnit, foldlUnits, foldrUnits
81+
@docs unitLength, getUnit, foldlUnits, foldrUnits, sliceUnits
8282

8383
-}
8484

@@ -825,7 +825,7 @@ unitLength =
825825
{-| Retrieve the character unit at a given index, or `Nothing` if the index is out of bounds.
826826
A negative index uses the end of the string as the starting point.
827827

828-
getUnit 1 "abc" == Just 'a'
828+
getUnit 1 "abc" == Just 'b'
829829

830830
getUnit 10 "abc" == Nothing
831831

@@ -857,3 +857,17 @@ character.
857857
foldrUnits : (Char -> b -> b) -> b -> String -> b
858858
foldrUnits =
859859
Gren.Kernel.String.foldrUnits
860+
861+
{-| Take a substring given a start and end index. Negative indexes
862+
are taken starting from the _end_ of the array. Indexes refers to character units,
863+
_not_ code points!
864+
865+
sliceUnits 1 -1 "snakes" == "nake"
866+
867+
sliceUnits 2 5 "snakes" == "ake"
868+
869+
sliceUnits 3 5 "hi 😎 there" == "😎"
870+
-}
871+
sliceUnits : Int -> Int -> String -> String
872+
sliceUnits =
873+
Gren.Kernel.String.sliceUnits

tests/gren.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"source-directories": [
55
"src"
66
],
7-
"gren-version": "0.6.2",
7+
"gren-version": "0.6.3",
88
"dependencies": {
99
"direct": {
1010
"gren-lang/core": "local:../",

0 commit comments

Comments
 (0)