11module 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
1015import Data.Maybe
@@ -15,6 +20,8 @@ import Control.Monad.ST (ST())
1520
1621foreign import data STArray :: * -> * -> *
1722
23+ type Assoc a = { value :: a , index :: Number }
24+
1825foreign import runSTArray " " "
1926 function runSTArray(f) {
2027 return f;
@@ -62,15 +69,57 @@ foreign import pokeSTArrayImpl """
6269pokeSTArray :: forall a h r . STArray h a -> Number -> a -> Eff (st :: ST h | r ) Boolean
6370pokeSTArray 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