|
| 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