Skip to content

Commit 68b8d48

Browse files
authored
Merge pull request #24 from justinwoo/builder-modify
add Builder.modify
2 parents b337e06 + f8cb34a commit 68b8d48

File tree

3 files changed

+24
-1
lines changed

3 files changed

+24
-1
lines changed

src/Data/Record/Builder.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,15 @@ exports.unsafeInsert = function(l) {
1919
};
2020
};
2121

22+
exports.unsafeModify = function(l) {
23+
return function (f) {
24+
return function(rec) {
25+
rec[l] = f(rec[l]);
26+
return rec;
27+
};
28+
};
29+
};
30+
2231
exports.unsafeDelete = function(l) {
2332
return function(rec) {
2433
delete rec[l];

src/Data/Record/Builder.purs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ module Data.Record.Builder
22
( Builder
33
, build
44
, insert
5+
, modify
56
, delete
67
, rename
78
, merge
@@ -14,6 +15,7 @@ import Type.Row (class RowLacks)
1415

1516
foreign import copyRecord :: forall r1. Record r1 -> Record r1
1617
foreign import unsafeInsert :: forall a r1 r2. String -> a -> Record r1 -> Record r2
18+
foreign import unsafeModify :: forall a b r1 r2. String -> (a -> b) -> Record r1 -> Record r2
1719
foreign import unsafeDelete :: forall r1 r2. String -> Record r1 -> Record r2
1820
foreign import unsafeRename :: forall r1 r2. String -> String -> Record r1 -> Record r2
1921
foreign import unsafeMerge :: forall r1 r2 r3. Record r1 -> Record r2 -> Record r3
@@ -49,6 +51,17 @@ insert
4951
-> Builder (Record r1) (Record r2)
5052
insert l a = Builder \r1 -> unsafeInsert (reflectSymbol l) a r1
5153

54+
-- | Build by modifying an existing field.
55+
modify
56+
:: forall l a b r r1 r2
57+
. RowCons l a r r1
58+
=> RowCons l b r r2
59+
=> IsSymbol l
60+
=> SProxy l
61+
-> (a -> b)
62+
-> Builder (Record r1) (Record r2)
63+
modify l f = Builder \r1 -> unsafeModify (reflectSymbol l) f r1
64+
5265
-- | Build by deleting an existing field.
5366
delete
5467
:: forall l a r1 r2

test/Main.purs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@ main = do
4949
let testBuilder = Builder.build (Builder.insert x 42
5050
>>> Builder.merge { y: true, z: "testing" }
5151
>>> Builder.delete y
52+
>>> Builder.modify x show
5253
>>> Builder.rename z y) {}
5354

5455
assert' "Data.Record.Builder" $
55-
testBuilder.x == 42 && testBuilder.y == "testing"
56+
testBuilder.x == "42" && testBuilder.y == "testing"

0 commit comments

Comments
 (0)