Skip to content

Commit 00ff8d2

Browse files
committed
Merge pull request #20 from ethul/topic/additional-functions
Topic/additional functions
2 parents 0e73b8d + f16ebad commit 00ff8d2

File tree

2 files changed

+87
-20
lines changed

2 files changed

+87
-20
lines changed

README.md

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,21 +116,33 @@
116116

117117
### Types
118118

119+
type Assoc a = { index :: Number, value :: a }
120+
119121
data STArray :: * -> * -> *
120122

121123

122124
### Values
123125

124126
emptySTArray :: forall a h r. Eff (st :: ST h | r) (STArray h a)
125127

128+
freeze :: forall a h r. STArray h a -> Eff (st :: ST h | r) [a]
129+
126130
peekSTArray :: forall a h r. STArray h a -> Number -> Eff (st :: ST h | r) (Maybe a)
127131

128132
pokeSTArray :: forall a h r. STArray h a -> Number -> a -> Eff (st :: ST h | r) Boolean
129133

130-
pushSTArray :: forall a h r. STArray h a -> a -> Eff (st :: ST h | r) Unit
134+
pushAllSTArray :: forall a h r. STArray h a -> [a] -> Eff (st :: ST h | r) Number
135+
136+
pushSTArray :: forall a h r. STArray h a -> a -> Eff (st :: ST h | r) Number
131137

132138
runSTArray :: forall a r. (forall h. Eff (st :: ST h | r) (STArray h a)) -> Eff r [a]
133139

140+
spliceSTArray :: forall a h r. STArray h a -> Number -> Number -> [a] -> Eff (st :: ST h | r) [a]
141+
142+
thaw :: forall a h r. [a] -> Eff (st :: ST h | r) (STArray h a)
143+
144+
toAssocArray :: forall a h r. STArray h a -> Eff (st :: ST h | r) [Assoc a]
145+
134146

135147
## Module Data.Array.Unsafe
136148

src/Data/Array/ST.purs

Lines changed: 74 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
1-
module Data.Array.ST
1+
module Data.Array.ST
22
( STArray(..)
3+
, Assoc()
34
, runSTArray
45
, emptySTArray
56
, peekSTArray
6-
, pokeSTArray
7-
, pushSTArray
7+
, pokeSTArray
8+
, pushSTArray
9+
, pushAllSTArray
10+
, spliceSTArray
11+
, freeze, thaw
12+
, toAssocArray
813
) where
914

1015
import Data.Maybe
@@ -15,6 +20,8 @@ import Control.Monad.ST (ST())
1520

1621
foreign import data STArray :: * -> * -> *
1722

23+
type Assoc a = { value :: a, index :: Number }
24+
1825
foreign import runSTArray """
1926
function runSTArray(f) {
2027
return f;
@@ -24,7 +31,7 @@ foreign import emptySTArray """
2431
function emptySTArray() {
2532
return [];
2633
}""" :: forall a h r. Eff (st :: ST h | r) (STArray h a)
27-
34+
2835
foreign import peekSTArrayImpl """
2936
function peekSTArrayImpl(arr, i, s, f) {
3037
return function() {
@@ -35,12 +42,12 @@ foreign import peekSTArrayImpl """
3542
return f;
3643
}
3744
};
38-
}""" :: forall a h e r. Fn4 (STArray h a)
39-
Number
45+
}""" :: forall a h e r. Fn4 (STArray h a)
46+
Number
4047
(a -> r)
4148
r
4249
(Eff (st :: ST h | e) r)
43-
50+
4451
peekSTArray :: forall a h r. STArray h a -> Number -> Eff (st :: ST h | r) (Maybe a)
4552
peekSTArray arr i = runFn4 peekSTArrayImpl arr i Just Nothing
4653

@@ -58,19 +65,67 @@ foreign import pokeSTArrayImpl """
5865
Number
5966
a
6067
(Eff (st :: ST h | e) Boolean)
61-
68+
6269
pokeSTArray :: forall a h r. STArray h a -> Number -> a -> Eff (st :: ST h | r) Boolean
6370
pokeSTArray arr i a = runFn3 pokeSTArrayImpl arr i a
6471

65-
foreign import pushSTArrayImpl """
66-
function pushSTArrayImpl(arr, a) {
67-
return function() {
68-
arr.push(a);
69-
return {};
72+
foreign import pushAllSTArrayImpl """
73+
function pushAllSTArrayImpl(arr, as) {
74+
return function(){
75+
return arr.push.apply(arr, as);
7076
};
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
77+
}""" :: forall a h r. Fn2 (STArray h a)
78+
[a]
79+
(Eff (st :: ST h | r) Number)
80+
81+
pushAllSTArray :: forall a h r. STArray h a -> [a] -> Eff (st :: ST h | r) Number
82+
pushAllSTArray = runFn2 pushAllSTArrayImpl
83+
84+
pushSTArray :: forall a h r. STArray h a -> a -> Eff (st :: ST h | r) Number
85+
pushSTArray arr a = pushAllSTArray arr [a]
86+
87+
foreign import spliceSTArrayImpl """
88+
function spliceSTArrayImpl(arr, index, howMany, bs) {
89+
return function(){
90+
return arr.splice.apply(arr, [index, howMany].concat(bs));
91+
};
92+
}""" :: forall a h r. Fn4 (STArray h a)
93+
Number
94+
Number
95+
[a]
96+
(Eff (st :: ST h | r) [a])
97+
98+
spliceSTArray :: forall a h r. STArray h a -> Number -> Number -> [a] -> Eff (st :: ST h | r) [a]
99+
spliceSTArray = runFn4 spliceSTArrayImpl
100+
101+
foreign import copyImpl """
102+
function copyImpl(arr) {
103+
return function(){
104+
var as = [];
105+
var i = -1;
106+
var n = arr.length;
107+
while(++i < n) {
108+
as[i] = arr[i];
109+
}
110+
return as;
111+
};
112+
}""" :: forall a b h r. a -> Eff (st :: ST h | r) b
113+
114+
freeze :: forall a h r. STArray h a -> Eff (st :: ST h | r) [a]
115+
freeze = copyImpl
116+
117+
thaw :: forall a h r. [a] -> Eff (st :: ST h | r) (STArray h a)
118+
thaw = copyImpl
119+
120+
foreign import toAssocArray """
121+
function toAssocArray(arr) {
122+
return function(){
123+
var as = [];
124+
var i = -1;
125+
var n = arr.length;
126+
while(++i < n) {
127+
as[i] = {value: arr[i], index: i};
128+
}
129+
return as;
130+
};
131+
}""" :: forall a h r. STArray h a -> Eff (st :: ST h | r) [Assoc a]

0 commit comments

Comments
 (0)