Skip to content

Commit 0e73b8d

Browse files
committed
Merge pull request #18 from purescript/st
Move STArray functions into Data.Array.ST
2 parents cba046d + 8e3ac24 commit 0e73b8d

File tree

4 files changed

+99
-3
lines changed

4 files changed

+99
-3
lines changed

Gruntfile.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ module.exports = function(grunt) {
1313

1414
pscMake: ["<%=libFiles%>"],
1515
dotPsci: ["<%=libFiles%>"],
16-
docgen: {
16+
pscDocs: {
1717
readme: {
1818
src: "src/**/*.purs",
1919
dest: "README.md"
@@ -25,6 +25,6 @@ module.exports = function(grunt) {
2525
grunt.loadNpmTasks("grunt-contrib-clean");
2626
grunt.loadNpmTasks("grunt-purescript");
2727

28-
grunt.registerTask("make", ["pscMake", "dotPsci", "docgen"]);
28+
grunt.registerTask("make", ["pscMake", "dotPsci", "pscDocs"]);
2929
grunt.registerTask("default", ["make"]);
3030
};

README.md

+20
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,26 @@
112112
zipWith :: forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
113113

114114

115+
## Module Data.Array.ST
116+
117+
### Types
118+
119+
data STArray :: * -> * -> *
120+
121+
122+
### Values
123+
124+
emptySTArray :: forall a h r. Eff (st :: ST h | r) (STArray h a)
125+
126+
peekSTArray :: forall a h r. STArray h a -> Number -> Eff (st :: ST h | r) (Maybe a)
127+
128+
pokeSTArray :: forall a h r. STArray h a -> Number -> a -> Eff (st :: ST h | r) Boolean
129+
130+
pushSTArray :: forall a h r. STArray h a -> a -> Eff (st :: ST h | r) Unit
131+
132+
runSTArray :: forall a r. (forall h. Eff (st :: ST h | r) (STArray h a)) -> Eff r [a]
133+
134+
115135
## Module Data.Array.Unsafe
116136

117137
### Values

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@
33
"dependencies": {
44
"grunt": "~0.4.4",
55
"grunt-purescript": "~0.5.1",
6-
"grunt-contrib-clean": "~0.5.0"
6+
"grunt-contrib-clean": "~0.6.0"
77
}
88
}

src/Data/Array/ST.purs

+76
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
module Data.Array.ST
2+
( STArray(..)
3+
, runSTArray
4+
, emptySTArray
5+
, peekSTArray
6+
, pokeSTArray
7+
, pushSTArray
8+
) where
9+
10+
import Data.Maybe
11+
import Data.Function
12+
13+
import Control.Monad.Eff
14+
import Control.Monad.ST (ST())
15+
16+
foreign import data STArray :: * -> * -> *
17+
18+
foreign import runSTArray """
19+
function runSTArray(f) {
20+
return f;
21+
}""" :: forall a r. (forall h. Eff (st :: ST h | r) (STArray h a)) -> Eff r [a]
22+
23+
foreign import emptySTArray """
24+
function emptySTArray() {
25+
return [];
26+
}""" :: forall a h r. Eff (st :: ST h | r) (STArray h a)
27+
28+
foreign import peekSTArrayImpl """
29+
function peekSTArrayImpl(arr, i, s, f) {
30+
return function() {
31+
var index = ~~i;
32+
if (0 <= index && index < arr.length) {
33+
return s(arr[index]);
34+
} else {
35+
return f;
36+
}
37+
};
38+
}""" :: forall a h e r. Fn4 (STArray h a)
39+
Number
40+
(a -> r)
41+
r
42+
(Eff (st :: ST h | e) r)
43+
44+
peekSTArray :: forall a h r. STArray h a -> Number -> Eff (st :: ST h | r) (Maybe a)
45+
peekSTArray arr i = runFn4 peekSTArrayImpl arr i Just Nothing
46+
47+
foreign import pokeSTArrayImpl """
48+
function pokeSTArrayImpl(arr, i, a) {
49+
return function() {
50+
var index = ~~i;
51+
if (0 <= index && index <= arr.length) {
52+
arr[index] = a;
53+
return true;
54+
}
55+
return false;
56+
};
57+
}""" :: forall a h e. Fn3 (STArray h a)
58+
Number
59+
a
60+
(Eff (st :: ST h | e) Boolean)
61+
62+
pokeSTArray :: forall a h r. STArray h a -> Number -> a -> Eff (st :: ST h | r) Boolean
63+
pokeSTArray arr i a = runFn3 pokeSTArrayImpl arr i a
64+
65+
foreign import pushSTArrayImpl """
66+
function pushSTArrayImpl(arr, a) {
67+
return function() {
68+
arr.push(a);
69+
return {};
70+
};
71+
}""" :: forall a h e. Fn2 (STArray h a)
72+
a
73+
(Eff (st :: ST h | e) Unit)
74+
75+
pushSTArray :: forall a h r. STArray h a -> a -> Eff (st :: ST h | r) Unit
76+
pushSTArray arr a = runFn2 pushSTArrayImpl arr a

0 commit comments

Comments
 (0)