Skip to content

Commit 6fb5b33

Browse files
committed
Additional functions for STArray
See ethul/purescript-angular#5
1 parent 61d887e commit 6fb5b33

File tree

2 files changed

+70
-11
lines changed

2 files changed

+70
-11
lines changed

README.md

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,21 +116,31 @@
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+
getAssocs :: forall a h r. STArray h a -> Eff (st :: ST h | r) [Assoc a]
129+
130+
getElems :: forall a h r. STArray h a -> Eff (st :: ST h | r) [a]
131+
126132
peekSTArray :: forall a h r. STArray h a -> Number -> Eff (st :: ST h | r) (Maybe a)
127133

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

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

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

142+
spliceSTArray :: forall a h r. STArray h a -> Number -> Number -> [a] -> Eff (st :: ST h | r) [a]
143+
134144

135145
## Module Data.Array.Unsafe
136146

src/Data/Array/ST.purs

Lines changed: 59 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
module Data.Array.ST
22
( STArray(..)
3+
, Assoc()
34
, runSTArray
45
, emptySTArray
56
, peekSTArray
67
, pokeSTArray
78
, pushSTArray
9+
, pushAllSTArray
10+
, spliceSTArray
11+
, getElems
12+
, getAssocs
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;
@@ -62,15 +69,57 @@ foreign import pokeSTArrayImpl """
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)
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
7483

75-
pushSTArray :: forall a h r. STArray h a -> a -> Eff (st :: ST h | r) Unit
76-
pushSTArray arr a = runFn2 pushSTArrayImpl arr a
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 getElems """
102+
function getElems(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 h r. STArray h a -> Eff (st :: ST h | r) [a]
113+
114+
foreign import getAssocs """
115+
function getAssocs(arr) {
116+
return function(){
117+
var as = [];
118+
var i = -1;
119+
var n = arr.length;
120+
while(++i < n) {
121+
as[i] = {value: arr[i], index: i};
122+
}
123+
return as;
124+
};
125+
}""" :: forall a h r. STArray h a -> Eff (st :: ST h | r) [Assoc a]

0 commit comments

Comments
 (0)