Skip to content

Commit 9bcd95d

Browse files
authored
Merge pull request #9 from sgronblo/make-arraybuffer-creation-effectful
Make ArrayBuffer creation effectful
2 parents 55ba148 + b2559b5 commit 9bcd95d

File tree

8 files changed

+172
-133
lines changed

8 files changed

+172
-133
lines changed

bower.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
},
2222
"devDependencies": {
2323
"purescript-debug": "^2.0.0",
24-
"purescript-quickcheck": "^3.0.0"
24+
"purescript-quickcheck": "^3.0.0",
25+
"purescript-partial": "^1.2.0"
2526
}
2627
}

src/Data/ArrayBuffer/ArrayBuffer.js

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,26 +3,36 @@
33
// module Data.ArrayBuffer.ArrayBuffer
44

55
exports.create = function(s) {
6-
return new ArrayBuffer(s);
6+
return function () {
7+
return new ArrayBuffer(s);
8+
}
79
}
810

911
exports.byteLength = function(a) {
10-
return a.byteLength;
12+
return function () {
13+
return a.byteLength;
14+
}
1115
}
1216

1317
exports.sliceImpl = function(s, e, a) {
14-
return a.slice(s,e);
18+
return function () {
19+
return a.slice(s, e);
20+
}
1521
}
1622

1723
exports.fromArray = function(s) {
18-
return (new Uint8Array(s)).buffer;
24+
return function() {
25+
return (new Uint8Array(s)).buffer;
26+
}
1927
}
2028

2129
exports.fromString = function(s) {
22-
var l = s.length;
23-
var ab = new ArrayBuffer(l * 2);
24-
var a = new Uint16Array(ab);
25-
for (var i = 0; i < l; i++)
26-
a[i] = s.charCodeAt(i);
27-
return ab;
30+
return function() {
31+
var l = s.length;
32+
var ab = new ArrayBuffer(l * 2);
33+
var a = new Uint16Array(ab);
34+
for (var i = 0; i < l; i++)
35+
a[i] = s.charCodeAt(i);
36+
return ab;
37+
}
2838
}

src/Data/ArrayBuffer/ArrayBuffer.purs

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,31 @@
1-
module Data.ArrayBuffer.ArrayBuffer where
2-
1+
module Data.ArrayBuffer.ArrayBuffer( ARRAYBUFFER()
2+
, create
3+
, byteLength
4+
, slice
5+
, fromArray
6+
, fromString
7+
) where
8+
9+
import Control.Monad.Eff (Eff)
310
import Data.Function.Uncurried (Fn3, runFn3)
411
import Data.ArrayBuffer.Types (ArrayBuffer, ByteOffset, ByteLength)
512

13+
foreign import data ARRAYBUFFER :: !
614

715
-- | Create an `ArrayBuffer` with the given capacity.
8-
foreign import create :: ByteLength -> ArrayBuffer
16+
foreign import create :: forall e. ByteLength -> Eff (arrayBuffer :: ARRAYBUFFER | e) ArrayBuffer
917

1018
-- | Represents the length of an `ArrayBuffer` in bytes.
11-
foreign import byteLength :: ArrayBuffer -> ByteLength
19+
foreign import byteLength :: forall e. ArrayBuffer -> Eff (arrayBuffer :: ARRAYBUFFER | e) ByteLength
1220

13-
foreign import sliceImpl :: Fn3 ByteOffset ByteOffset ArrayBuffer ArrayBuffer
21+
foreign import sliceImpl :: forall e. Fn3 ByteOffset ByteOffset ArrayBuffer (Eff (arrayBuffer :: ARRAYBUFFER | e) ArrayBuffer)
1422

1523
-- | Returns a new `ArrayBuffer` whose contents are a copy of this ArrayBuffer's bytes from begin, inclusive, up to end, exclusive.
16-
slice :: ByteOffset -> ByteOffset -> ArrayBuffer -> ArrayBuffer
24+
slice :: forall e. ByteOffset -> ByteOffset -> ArrayBuffer -> Eff (arrayBuffer :: ARRAYBUFFER | e) ArrayBuffer
1725
slice = runFn3 sliceImpl
1826

1927
-- | Convert an array into an `ArrayBuffer` representation.
20-
foreign import fromArray :: Array Number -> ArrayBuffer
28+
foreign import fromArray :: forall e. Array Number -> Eff (arrayBuffer :: ARRAYBUFFER | e) ArrayBuffer
2129

2230
-- | Convert a string into an `ArrayBuffer` representation.
23-
foreign import fromString :: String -> ArrayBuffer
24-
31+
foreign import fromString :: forall e. String -> Eff (arrayBuffer :: ARRAYBUFFER | e) ArrayBuffer

src/Data/ArrayBuffer/DataView.js

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,33 @@
44

55

66
exports.whole = function(b) {
7-
return new DataView(b);
7+
return function() {
8+
return new DataView(b);
9+
}
810
}
911

1012
exports.sliceImpl = function(just, nothing, s, l, b) {
11-
return s + l <= b.byteLength? just(new DataView(b, s, l)) : nothing;
13+
return function() {
14+
return s + l <= b.byteLength ? just(new DataView(b, s, l)) : nothing;
15+
}
1216
}
1317

1418
exports.buffer = function(v) {
15-
return v.buffer;
19+
return function() {
20+
return v.buffer;
21+
}
1622
}
1723

1824
exports.byteOffset = function(v) {
19-
return v.byteOffset;
25+
return function() {
26+
return v.byteOffset;
27+
}
2028
}
2129

2230
exports.byteLength = function(v) {
23-
return v.byteLength;
31+
return function() {
32+
return v.byteLength;
33+
}
2434
}
2535

2636
exports.getterImpl = function(just, nothing, s, l, e, v, o) {

src/Data/ArrayBuffer/DataView.purs

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
module Data.ArrayBuffer.DataView( READER()
2-
, WRITER()
3-
, whole
1+
module Data.ArrayBuffer.DataView( whole
42
, slice
53
, buffer
64
, byteOffset
@@ -38,50 +36,47 @@ module Data.ArrayBuffer.DataView( READER()
3836
) where
3937

4038
import Prelude
39+
import Data.ArrayBuffer.ArrayBuffer (ARRAYBUFFER)
4140
import Data.ArrayBuffer.Types (ByteOffset, DataView, ByteLength, ArrayBuffer)
4241
import Data.Function.Uncurried (Fn5, Fn7, runFn5, runFn7)
4342
import Data.Maybe (Maybe(..))
4443
import Control.Monad.Eff (Eff)
4544
import Data.UInt (UInt)
4645

4746
-- | Type for all fetching functions.
48-
type Getter r = forall e. DataView -> ByteOffset -> Eff (reader :: READER | e) (Maybe r)
47+
type Getter r = forall e. DataView -> ByteOffset -> Eff (arrayBuffer :: ARRAYBUFFER | e) (Maybe r)
4948

5049
-- | Type for all storing functions.
51-
type Setter r = forall e. DataView -> r -> ByteOffset -> Eff (writer :: WRITER | e) Unit
50+
type Setter r = forall e. DataView -> r -> ByteOffset -> Eff (arrayBuffer :: ARRAYBUFFER | e) Unit
5251

5352
-- | View mapping the whole `ArrayBuffer`.
54-
foreign import whole :: ArrayBuffer -> DataView
53+
foreign import whole :: forall e. ArrayBuffer -> Eff (arrayBuffer :: ARRAYBUFFER | e) DataView
5554

56-
foreign import sliceImpl :: Fn5 (DataView -> Maybe DataView) (Maybe DataView) ByteOffset ByteLength ArrayBuffer (Maybe DataView)
55+
foreign import sliceImpl :: forall e. Fn5 (DataView -> Maybe DataView) (Maybe DataView) ByteOffset ByteLength ArrayBuffer (Eff (arrayBuffer :: ARRAYBUFFER | e) (Maybe DataView))
5756

5857
-- | View mapping a region of the `ArrayBuffer`.
59-
slice :: ByteOffset -> ByteLength -> ArrayBuffer -> Maybe DataView
58+
slice :: forall e. ByteOffset -> ByteLength -> ArrayBuffer -> (Eff (arrayBuffer :: ARRAYBUFFER | e) (Maybe DataView))
6059
slice = runFn5 sliceImpl Just Nothing
6160

6261
-- | `ArrayBuffer` being mapped by the view.
63-
foreign import buffer :: DataView -> ArrayBuffer
62+
foreign import buffer :: forall e. DataView -> Eff (arrayBuffer :: ARRAYBUFFER | e) ArrayBuffer
6463

6564
-- | Represents the offset of this view from the start of its `ArrayBuffer`.
66-
foreign import byteOffset :: DataView -> ByteOffset
65+
foreign import byteOffset :: forall e. DataView -> Eff (arrayBuffer :: ARRAYBUFFER | e) ByteOffset
6766

6867
-- | Represents the length of this view.
69-
foreign import byteLength :: DataView -> ByteLength
68+
foreign import byteLength :: forall e. DataView -> Eff (arrayBuffer :: ARRAYBUFFER | e) ByteLength
7069

7170

72-
foreign import data READER :: !
73-
7471
type Endianness = Boolean
7572

76-
foreign import getterImpl :: forall e r. Fn7 (r -> Maybe r) (Maybe r) String ByteLength Endianness DataView ByteOffset (Eff (reader :: READER | e) (Maybe r))
73+
foreign import getterImpl :: forall e r. Fn7 (r -> Maybe r) (Maybe r) String ByteLength Endianness DataView ByteOffset (Eff (arrayBuffer :: ARRAYBUFFER | e) (Maybe r))
7774

78-
getter :: forall e r. String -> ByteLength -> Endianness -> DataView -> ByteOffset -> Eff (reader :: READER | e) (Maybe r)
75+
getter :: forall e r. String -> ByteLength -> Endianness -> DataView -> ByteOffset -> Eff (arrayBuffer :: ARRAYBUFFER | e) (Maybe r)
7976
getter = runFn7 getterImpl Just Nothing
8077

8178

82-
foreign import data WRITER :: !
83-
84-
foreign import setter :: forall e r. String -> Endianness -> DataView -> r -> ByteOffset -> Eff (writer :: WRITER | e) Unit
79+
foreign import setter :: forall e r. String -> Endianness -> DataView -> r -> ByteOffset -> Eff (arrayBuffer :: ARRAYBUFFER | e) Unit
8580

8681

8782
-- | Fetch int8 value at a certain index in a `DataView`.
@@ -182,5 +177,4 @@ setFloat64be :: Setter Number
182177
setFloat64be = setter "setFloat64" false
183178

184179
setFloat64le :: Setter Number
185-
setFloat64le = setter "setFloat64" true
186-
180+
setFloat64le = setter "setFloat64" true

src/Data/ArrayBuffer/Typed.js

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,9 @@ exports.asFloat64Array = function(v) {
3939
}
4040

4141
exports.dataView = function(a) {
42-
return a;
42+
return function() {
43+
return a;
44+
}
4345
}
4446

4547
exports.setImpl = function(ra, off, a) {
@@ -49,25 +51,33 @@ exports.setImpl = function(ra, off, a) {
4951
}
5052

5153
exports.unsafeAtImpl = function(a, i) {
54+
return function() {
5255
return a[i];
56+
}
5357
}
5458

5559
exports.hasIndexImpl = function(a, i) {
56-
return i in a;
60+
return function() {
61+
return i in a;
62+
}
5763
}
5864

5965
exports.toArray = function(a) {
60-
var l = a.length;
61-
var ret = new Array(l);
62-
for (var i = 0; i < l; i++)
63-
ret[i] = a[i];
64-
return ret;
66+
return function() {
67+
var l = a.length;
68+
var ret = new Array(l);
69+
for (var i = 0; i < l; i++)
70+
ret[i] = a[i];
71+
return ret;
72+
}
6573
}
6674

6775
exports.toIntArray = function(a) {
68-
var l = a.length;
69-
var ret = new Array(l);
70-
for (var i = 0; i < l; i++)
71-
ret[i] = a[i]|0;
72-
return ret;
73-
}
76+
return function() {
77+
var l = a.length;
78+
var ret = new Array(l);
79+
for (var i = 0; i < l; i++)
80+
ret[i] = a[i] | 0;
81+
return ret;
82+
}
83+
}

src/Data/ArrayBuffer/Typed.purs

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
module Data.ArrayBuffer.Typed( Writer()
2-
, asInt8Array
1+
module Data.ArrayBuffer.Typed( asInt8Array
32
, asInt16Array
43
, asInt32Array
54
, asUint8Array
@@ -17,18 +16,16 @@ module Data.ArrayBuffer.Typed( Writer()
1716
, toIntArray
1817
) where
1918

20-
import Prelude (Unit, ($))
19+
import Control.Monad.Eff (Eff)
20+
import Data.ArrayBuffer.ArrayBuffer (ARRAYBUFFER)
2121
import Data.ArrayBuffer.Types (ArrayView, ByteOffset, DataView, Float64Array, Float32Array, Uint8ClampedArray, Uint32Array, Uint16Array, Uint8Array, Int32Array, Int16Array, Int8Array)
2222
import Data.Function.Uncurried (Fn2, Fn3, runFn2, runFn3)
2323
import Data.Maybe (Maybe(..))
24-
import Control.Monad.Eff (Eff)
25-
26-
foreign import data Writer :: !
24+
import Prelude (Unit, ($), bind, pure)
2725

2826
-- | Create typed int8 array viewing the buffer mapped by the `DataView`
2927
foreign import asInt8Array :: DataView -> Int8Array
3028

31-
3229
-- | Create typed int16 array viewing the buffer mapped by the `DataView`
3330
foreign import asInt16Array :: DataView -> Int16Array
3431

@@ -54,36 +51,39 @@ foreign import asFloat32Array :: DataView -> Float32Array
5451
foreign import asFloat64Array :: DataView -> Float64Array
5552

5653
-- | Interpret typed array as a `DataView`.
57-
foreign import dataView :: forall a. ArrayView a -> DataView
54+
foreign import dataView :: forall a e. ArrayView a -> Eff (arrayBuffer :: ARRAYBUFFER | e) DataView
5855

59-
foreign import setImpl :: forall a e. Fn3 (ArrayView a) ByteOffset (ArrayView a) (Eff (writer :: Writer | e) Unit)
56+
foreign import setImpl :: forall a e. Fn3 (ArrayView a) ByteOffset (ArrayView a) (Eff (arrayBuffer :: ARRAYBUFFER | e) Unit)
6057

6158
-- | Stores multiple values in the last typed array, reading input values from ther first typed array.
62-
set :: forall a e. ArrayView a -> ByteOffset -> ArrayView a -> Eff (writer :: Writer | e) Unit
59+
set :: forall a e. ArrayView a -> ByteOffset -> ArrayView a -> Eff (arrayBuffer :: ARRAYBUFFER | e) Unit
6360
set = runFn3 setImpl
6461

65-
foreign import unsafeAtImpl :: forall a. Fn2 (ArrayView a) Int Number
62+
foreign import unsafeAtImpl :: forall a e. Fn2 (ArrayView a) Int (Eff (arrayBuffer :: ARRAYBUFFER | e) Number)
6663

6764
-- | Fetch element at index.
68-
unsafeAt :: forall a. ArrayView a -> Int -> Number
65+
unsafeAt :: forall a e. ArrayView a -> Int -> Eff (arrayBuffer :: ARRAYBUFFER | e) Number
6966
unsafeAt = runFn2 unsafeAtImpl
7067

71-
foreign import hasIndexImpl :: forall a. Fn2 (ArrayView a) Int Boolean
68+
foreign import hasIndexImpl :: forall a e. Fn2 (ArrayView a) Int (Eff (arrayBuffer :: ARRAYBUFFER | e) Boolean)
7269

7370
-- | Determine if a certain index is valid.
74-
hasIndex :: forall a. ArrayView a -> Int -> Boolean
71+
hasIndex :: forall a e. ArrayView a -> Int -> Eff (arrayBuffer :: ARRAYBUFFER | e) Boolean
7572
hasIndex = runFn2 hasIndexImpl
7673

7774
-- | Fetch element at index.
78-
at :: forall a. ArrayView a -> Int -> Maybe Number
79-
at a n = if a `hasIndex` n then
80-
Just $ unsafeAt a n
81-
else
82-
Nothing
75+
at :: forall a e. ArrayView a -> Int -> Eff (arrayBuffer :: ARRAYBUFFER | e) (Maybe Number)
76+
at a n = do
77+
indexExists <- a `hasIndex` n
78+
if indexExists
79+
then do
80+
element <- unsafeAt a n
81+
pure $ Just element
82+
else
83+
pure Nothing
8384

8485
-- | Turn typed array into an array.
85-
foreign import toArray :: forall a. ArrayView a -> Array Number
86+
foreign import toArray :: forall a e. ArrayView a -> Eff (arrayBuffer :: ARRAYBUFFER | e) (Array Number)
8687

8788
-- | Turn typed array into integer array.
88-
foreign import toIntArray :: forall a. ArrayView a -> Array Int
89-
89+
foreign import toIntArray :: forall a e. ArrayView a -> Eff (arrayBuffer :: ARRAYBUFFER | e) (Array Int)

0 commit comments

Comments
 (0)