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
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; 
@@ -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+ 
2835foreign  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+ 
4451peekSTArray  ::  forall  a  h  r . STArray  h  a  ->  Number  ->  Eff  (st  ::  ST  h  | r ) (Maybe  a )
4552peekSTArray 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+ 
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 )
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