Skip to content

Commit b7bb914

Browse files
committed
Split getters and setters into big and little endian. Change PureScript
type for Uint32 operations to Int53.
1 parent 92de878 commit b7bb914

File tree

4 files changed

+141
-59
lines changed

4 files changed

+141
-59
lines changed

bower.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
"name": "purescript-arraybuffer",
33
"version": "2.0.0",
44
"license": "MIT",
5-
"repository": {
6-
"type": "git",
5+
"repository": {
6+
"type": "git",
77
"url": "git://github.com/jacereda/purescript-arraybuffer.git"
88
},
99
"ignore": [
@@ -16,7 +16,8 @@
1616
"purescript-functions": "~1.0.0",
1717
"purescript-arraybuffer-types": "~0.2.0",
1818
"purescript-maybe": "~1.0.0",
19-
"purescript-eff": "1.0.0"
19+
"purescript-eff": "1.0.0",
20+
"purescript-int-53": "^2.0.1"
2021
},
2122
"devDependencies": {
2223
"purescript-debug": "~1.0.0",

src/Data/ArrayBuffer/DataView.js

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,19 +23,21 @@ exports.byteLength = function(v) {
2323
return v.byteLength;
2424
}
2525

26-
exports.getterImpl = function(just, nothing, s, l, v, o) {
26+
exports.getterImpl = function(just, nothing, s, l, e, v, o) {
2727
return function() {
28-
return (o + l) <= v.byteLength? just(v[s].call(v,o)) : nothing;
28+
return (o + l) <= v.byteLength? just(v[s].call(v,o,e)) : nothing;
2929
};
3030
}
3131

3232
exports.setter = function(s) {
33-
return function(v) {
34-
var f = v[s];
35-
return function(n) {
36-
return function(o) {
37-
return function() {
38-
f.call(v,o,n);
33+
return function(e) {
34+
return function(v) {
35+
var f = v[s];
36+
return function(n) {
37+
return function(o) {
38+
return function() {
39+
f.call(v,o,n,e);
40+
};
3941
};
4042
};
4143
};

src/Data/ArrayBuffer/DataView.purs

Lines changed: 96 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -7,29 +7,42 @@ module Data.ArrayBuffer.DataView( READER()
77
, byteLength
88
, Getter()
99
, getInt8
10-
, getInt16
11-
, getInt32
10+
, getInt16be
11+
, getInt32be
1212
, getUint8
13-
, getUint16
14-
, getUint32
15-
, getFloat32
16-
, getFloat64
13+
, getUint16be
14+
, getUint32be
15+
, getFloat32be
16+
, getFloat64be
17+
, getInt16le
18+
, getInt32le
19+
, getUint16le
20+
, getUint32le
21+
, getFloat32le
22+
, getFloat64le
1723
, Setter()
1824
, setInt8
19-
, setInt16
20-
, setInt32
25+
, setInt16be
26+
, setInt32be
2127
, setUint8
22-
, setUint16
23-
, setUint32
24-
, setFloat32
25-
, setFloat64
28+
, setUint16be
29+
, setUint32be
30+
, setFloat32be
31+
, setFloat64be
32+
, setInt16le
33+
, setInt32le
34+
, setUint16le
35+
, setUint32le
36+
, setFloat32le
37+
, setFloat64le
2638
) where
2739

2840
import Prelude
2941
import Data.ArrayBuffer.Types (ByteOffset, DataView, ByteLength, ArrayBuffer)
30-
import Data.Function.Uncurried (Fn5, Fn6, runFn5, runFn6)
42+
import Data.Function.Uncurried (Fn5, Fn7, runFn5, runFn7)
3143
import Data.Maybe (Maybe(..))
3244
import Control.Monad.Eff (Eff)
45+
import Data.Int53 (Int53)
3346

3447
-- | Type for all fetching functions.
3548
type Getter r = forall e. DataView -> ByteOffset -> Eff (reader :: READER | e) (Maybe r)
@@ -58,77 +71,115 @@ foreign import byteLength :: DataView -> ByteLength
5871

5972
foreign import data READER :: !
6073

61-
foreign import getterImpl :: forall e r. Fn6 (r -> Maybe r) (Maybe r) String ByteLength DataView ByteOffset (Eff (reader :: READER | e) (Maybe r))
74+
type Endianness = Boolean
6275

63-
getter :: forall e r. String -> ByteLength -> DataView -> ByteOffset -> Eff (reader :: READER | e) (Maybe r)
64-
getter = runFn6 getterImpl Just Nothing
76+
foreign import getterImpl :: forall e r. Fn7 (r -> Maybe r) (Maybe r) String ByteLength Endianness DataView ByteOffset (Eff (reader :: READER | e) (Maybe r))
77+
78+
getter :: forall e r. String -> ByteLength -> Endianness -> DataView -> ByteOffset -> Eff (reader :: READER | e) (Maybe r)
79+
getter = runFn7 getterImpl Just Nothing
6580

6681

6782
foreign import data WRITER :: !
6883

69-
foreign import setter :: forall e r. String -> DataView -> r -> ByteOffset -> Eff (writer :: WRITER | e) Unit
84+
foreign import setter :: forall e r. String -> Endianness -> DataView -> r -> ByteOffset -> Eff (writer :: WRITER | e) Unit
7085

7186

7287
-- | Fetch int8 value at a certain index in a `DataView`.
7388
getInt8 :: Getter Int
74-
getInt8 = getter "getInt8" 1
89+
getInt8 = getter "getInt8" 1 false
7590

7691
-- | Fetch int16 value at a certain index in a `DataView`.
77-
getInt16 :: Getter Int
78-
getInt16 = getter "getInt16" 2
92+
getInt16be :: Getter Int
93+
getInt16be = getter "getInt16" 2 false
94+
95+
getInt16le :: Getter Int
96+
getInt16le = getter "getInt16" 2 true
7997

8098
-- | Fetch int32 value at a certain index in a `DataView`.
81-
getInt32 :: Getter Int
82-
getInt32 = getter "getInt32" 4
99+
getInt32be :: Getter Int
100+
getInt32be = getter "getInt32" 4 false
101+
102+
getInt32le :: Getter Int
103+
getInt32le = getter "getInt32" 4 true
83104

84105
-- | Fetch uint8 value at a certain index in a `DataView`.
85106
getUint8 :: Getter Int
86-
getUint8 = getter "getUint8" 1
107+
getUint8 = getter "getUint8" 1 false
87108

88109
-- | Fetch uint16 value at a certain index in a `DataView`.
89-
getUint16 :: Getter Int
90-
getUint16 = getter "getUint16" 2
110+
getUint16be :: Getter Int
111+
getUint16be = getter "getUint16" 2 false
112+
113+
getUint16le :: Getter Int
114+
getUint16le = getter "getUint16" 2 true
91115

92116
-- | Fetch uint32 value at a certain index in a `DataView`.
93-
getUint32 :: Getter Int
94-
getUint32 = getter "getUint32" 4
117+
getUint32be :: Getter Int53
118+
getUint32be = getter "getUint32" 4 false
119+
120+
getUint32le :: Getter Int53
121+
getUint32le = getter "getUint32" 4 true
95122

96123
-- | Fetch float32 value at a certain index in a `DataView`.
97-
getFloat32 :: Getter Number
98-
getFloat32 = getter "getFloat32" 4
124+
getFloat32be :: Getter Number
125+
getFloat32be = getter "getFloat32" 4 false
126+
127+
getFloat32le :: Getter Number
128+
getFloat32le = getter "getFloat32" 4 true
99129

100130
-- | Fetch float64 value at a certain index in a `DataView`.
101-
getFloat64 :: Getter Number
102-
getFloat64 = getter "getFloat64" 8
131+
getFloat64be :: Getter Number
132+
getFloat64be = getter "getFloat64" 8 false
133+
134+
getFloat64le :: Getter Number
135+
getFloat64le = getter "getFloat64" 8 true
103136

104137
-- | Store int8 value at a certain index in a `DataView`.
105138
setInt8 :: Setter Int
106-
setInt8 = setter "setInt8"
139+
setInt8 = setter "setInt8" false
107140

108141
-- | Store int16 value at a certain index in a `DataView`.
109-
setInt16 :: Setter Int
110-
setInt16 = setter "setInt16"
142+
setInt16be :: Setter Int
143+
setInt16be = setter "setInt16" false
144+
145+
setInt16le :: Setter Int
146+
setInt16le = setter "setInt16" true
111147

112148
-- | Store int32 value at a certain index in a `DataView`.
113-
setInt32 :: Setter Int
114-
setInt32 = setter "setInt32"
149+
setInt32be :: Setter Int
150+
setInt32be = setter "setInt32" false
151+
152+
setInt32le :: Setter Int
153+
setInt32le = setter "setInt32" true
115154

116155
-- | Store uint8 value at a certain index in a `DataView`.
117156
setUint8 :: Setter Int
118-
setUint8 = setter "setUint8"
157+
setUint8 = setter "setUint8" false
119158

120159
-- | Store uint16 value at a certain index in a `DataView`.
121-
setUint16 :: Setter Int
122-
setUint16 = setter "setUint16"
160+
setUint16be :: Setter Int
161+
setUint16be = setter "setUint16" false
162+
163+
setUint16le :: Setter Int
164+
setUint16le = setter "setUint16" true
123165

124166
-- | Store uint32 value at a certain index in a `DataView`.
125-
setUint32 :: Setter Int
126-
setUint32 = setter "setUint32"
167+
setUint32be :: Setter Int53
168+
setUint32be = setter "setUint32" false
169+
170+
setUint32le :: Setter Int53
171+
setUint32le = setter "setUint32" true
127172

128173
-- | Store float32 value at a certain index in a `DataView`.
129-
setFloat32 :: Setter Number
130-
setFloat32 = setter "setFloat32"
174+
setFloat32be :: Setter Number
175+
setFloat32be = setter "setFloat32" false
176+
177+
setFloat32le :: Setter Number
178+
setFloat32le = setter "setFloat32" true
131179

132180
-- | Store float64 value at a certain index in a `DataView`.
133-
setFloat64 :: Setter Number
134-
setFloat64 = setter "setFloat64"
181+
setFloat64be :: Setter Number
182+
setFloat64be = setter "setFloat64" false
183+
184+
setFloat64le :: Setter Number
185+
setFloat64le = setter "setFloat64" true

test/Main.purs

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,26 @@
11
module Test.Main where
22

3-
import Prelude (Unit, negate, bind, ($), (==), (&&), (<$>))
3+
import Prelude ( Unit, negate, bind, ($), (==), (&&), (<$>), pure
4+
, (=<<), (*), (-) )
45
import Data.Maybe (Maybe(..))
56
import Test.QuickCheck
67
import Control.Monad.Eff (Eff)
78
import Control.Monad.Eff.Console (CONSOLE)
89
import Control.Monad.Eff.Random (RANDOM)
910
import Control.Monad.Eff.Exception (EXCEPTION)
11+
import Data.Int53 (fromInt, pow)
1012
import Data.ArrayBuffer.ArrayBuffer as AB
1113
import Data.ArrayBuffer.DataView as DV
1214
import Data.ArrayBuffer.Typed as TA
1315

14-
main :: Eff ( console :: CONSOLE, random :: RANDOM, err :: EXCEPTION ) Unit
16+
main :: forall e
17+
. Eff ( console :: CONSOLE
18+
, random :: RANDOM
19+
, err :: EXCEPTION
20+
, reader :: DV.READER
21+
, writer :: DV.WRITER
22+
| e )
23+
Unit
1524
main = do
1625
let ab = AB.create 4
1726
assert $ AB.byteLength ab == 4
@@ -43,6 +52,25 @@ main = do
4352

4453
assert $ [1.0,2.0,3.0] == (TA.toArray $ TA.asInt8Array $ DV.whole $ AB.fromArray [1.0,2.0,3.0])
4554

55+
assert =<< do
56+
let ab' = AB.create 2
57+
let dv' = DV.whole ab'
58+
DV.setUint8 dv' 123 0
59+
DV.setUint8 dv' 0 1
60+
leVal <- DV.getUint16le dv' 0
61+
beVal <- DV.getUint16be dv' 0
62+
pure ((Just 123 == leVal) && (Just 31488 == beVal))
4663

47-
assert :: Boolean -> QC () Unit
64+
assert =<< do
65+
let ab' = AB.create 4
66+
let dv' = DV.whole ab'
67+
DV.setUint8 dv' 255 0
68+
DV.setUint8 dv' 255 1
69+
DV.setUint8 dv' 255 2
70+
DV.setUint8 dv' 255 3
71+
val <- DV.getUint32be dv' 0
72+
let expected = fromInt 2 `pow` fromInt 32 - fromInt 1
73+
pure (Just expected == val)
74+
75+
assert :: forall e. Boolean -> QC e Unit
4876
assert = quickCheck' 1

0 commit comments

Comments
 (0)