Skip to content

Commit b57119b

Browse files
committed
Add modifyRef that returns a pure value
This is equivalent to the atomicModifyIORef from Haskell
1 parent 3d3a414 commit b57119b

File tree

3 files changed

+49
-35
lines changed

3 files changed

+49
-35
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313

1414
modifyRef :: forall s r. RefVal s -> (s -> s) -> Eff (ref :: Ref | r) Unit
1515

16+
modifyRef' :: forall s b r. RefVal s -> (s -> Tuple s b) -> Eff (ref :: Ref | r) b
17+
1618
newRef :: forall s r. s -> Eff (ref :: Ref | r) (RefVal s)
1719

1820
readRef :: forall s r. RefVal s -> Eff (ref :: Ref | r) s

bower.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,8 @@
1616
"bower.json",
1717
"Gruntfile.js",
1818
"package.json"
19-
]
19+
],
20+
"dependencies": {
21+
"purescript-tuples": "~0.2.1"
22+
}
2023
}

src/Control/Monad/Eff/Ref.purs

Lines changed: 43 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,51 @@
11
module Control.Monad.Eff.Ref where
22

33
import Control.Monad.Eff
4+
import Data.Tuple
45

56
foreign import data Ref :: !
67

78
foreign import data RefVal :: * -> *
89

9-
foreign import newRef
10-
"function newRef(val) {\
11-
\ return function () {\
12-
\ return { value: val };\
13-
\ };\
14-
\}" :: forall s r. s -> Eff (ref :: Ref | r) (RefVal s)
15-
16-
foreign import readRef
17-
"function readRef(ref) {\
18-
\ return function() {\
19-
\ return ref.value;\
20-
\ };\
21-
\}" :: forall s r. RefVal s -> Eff (ref :: Ref | r) s
22-
23-
24-
foreign import modifyRef
25-
"function modifyRef(ref) {\
26-
\ return function(f) {\
27-
\ return function() {\
28-
\ ref.value = f(ref.value);\
29-
\ return {};\
30-
\ };\
31-
\ };\
32-
\}" :: forall s r. RefVal s -> (s -> s) -> Eff (ref :: Ref | r) Unit
33-
34-
foreign import writeRef
35-
"function writeRef(ref) {\
36-
\ return function(val) {\
37-
\ return function() {\
38-
\ ref.value = val;\
39-
\ return {};\
40-
\ };\
41-
\ };\
42-
\}" :: forall s r. RefVal s -> s -> Eff (ref :: Ref | r) Unit
10+
foreign import newRef """
11+
function newRef(val) {
12+
return function () {
13+
return { value: val };
14+
};
15+
}
16+
""" :: forall s r. s -> Eff (ref :: Ref | r) (RefVal s)
17+
18+
foreign import readRef """
19+
function readRef(ref) {
20+
return function() {
21+
return ref.value;
22+
};
23+
}
24+
""" :: forall s r. RefVal s -> Eff (ref :: Ref | r) s
25+
26+
27+
foreign import modifyRef' """
28+
function modifyRef$prime(ref) {
29+
return function(f) {
30+
return function() {
31+
var t = f(ref.value);
32+
ref.value = t.value0;
33+
return t.value1;
34+
};
35+
};
36+
}
37+
""" :: forall s b r. RefVal s -> (s -> Tuple s b) -> Eff (ref :: Ref | r) b
38+
39+
modifyRef :: forall s r. RefVal s -> (s -> s) -> Eff (ref :: Ref | r) Unit
40+
modifyRef ref f = modifyRef' ref (\s -> Tuple (f s) unit)
41+
42+
foreign import writeRef """
43+
function writeRef(ref) {
44+
return function(val) {
45+
return function() {
46+
ref.value = val;
47+
return {};
48+
};
49+
};
50+
}
51+
""" :: forall s r. RefVal s -> s -> Eff (ref :: Ref | r) Unit

0 commit comments

Comments
 (0)