git.iko.soy/rowtype-yoga/purescript-arraybuffer-builder
on master help sign in
.github/workflows/ci.ymlnew file+46
since splitsnapshots
unifiedsplit
@@ -0,0 +1,46 @@
1+name: CI
2+
3+on:
4+ push:
5+ pull_request:
6+
7+jobs:
8+ build:
9+ runs-on: ubuntu-latest
10+
11+ steps:
12+ - uses: actions/checkout@v2
13+
14+ - name: Set up a PureScript toolchain
15+ uses: purescript-contrib/setup-purescript@main
16+ with:
17+ purescript: "unstable"
18+ purs-tidy: "latest"
19+
20+ - name: Cache PureScript dependencies
21+ uses: actions/cache@v2
22+ with:
23+ key: ${{ runner.os }}-spago-${{ hashFiles('**/*.dhall') }}-2
24+ path: |
25+ .spago
26+ output
27+ - name: Install dependencies
28+ run: spago install
29+
30+ - name: Build source
31+ run: spago build --no-install --purs-args '--censor-lib --strict --censor-codes='UserDefinedWarning''
32+
33+ - name: Install dev dependencies
34+ run: spago -x spago-dev.dhall install
35+
36+ - name: Run tests
37+ run: spago -x spago-dev.dhall test --no-install
38+
39+ - name: Check formatting
40+ run: purs-tidy check src test bench
41+
42+ - name: Verify Bower & Pulp
43+ run: |
44+ npm install bower pulp@16.0.0-0
45+ npx bower install
46+ npx pulp build -- --censor-lib --strict
.github/workflows/push-build.ymldeleted−42
@@ -1,42 +0,0 @@
1−name: CI
2−
3−on: [push]
4−
5−jobs:
6− build:
7−
8− runs-on: ubuntu-latest
9−
10− # https://github.com/purescript-contrib/setup-purescript
11−
12− steps:
13− # https://github.com/cachix/install-nix-action
14− - uses: actions/checkout@v2.3.4
15− - uses: cachix/install-nix-action@v13
16− with:
17− nix_path: nixpkgs=channel:nixos-unstable
18− - run: nix-shell --command 'spago --global-cache skip --config test.dhall test'
19−
20− # https://github.com/purescript-contrib/setup-purescript
21−
22− # - uses: actions/checkout@v2
23− # - name: Set up a PureScript toolchain
24− # uses: purescript-contrib/setup-purescript@main
25− # with:
26− # purescript: "0.14.1"
27− # spago: "0.20.1"
28−
29−# - name: Cache PureScript dependencies
30−# uses: actions/cache@v2
31−# # This cache uses the .dhall files to know when it should reinstall
32−# # and rebuild packages. It caches both the installed packages from
33−# # the `.spago` directory and compilation artifacts from the `output`
34−# # directory. When restored the compiler will rebuild any files that
35−# # have changed. If you do not want to cache compiled output, remove
36−# # the `output` path.
37−# with:
38−# key: ${{ runner.os }}-spago-${{ hashFiles('**/*.dhall') }}
39−# path: |
40−# .spago
41−
42− # - run: spago -x test.dhall test
CHANGELOG.md+10−1
@@ -1,6 +1,15 @@
1# Changelog
1# Changelog
2
2
3+## v3.1.0 2022-12-10
4+
5+- Transfer to __rowtype-yoga__.
6+- Docs.
7+
3−## v3.0.0 2022-04-21
8+## v3.0.1 2022-05-04
9+
10+CI repair. Change `test.dhall` to `spago-dev.dhall`.
11+
12+## v3.0.0 2022-05-04
4
13
5Build for PureScript v0.15.
14Build for PureScript v0.15.
6
15
DEVELOPMENT.mddeleted−43
@@ -1,43 +0,0 @@
1−# Development Notes
2−
3−All of the commands needed for development are in the `shell.nix` environment.
4−
5−```
6−$ nix-shell
7−```
8−
9−## Edit
10−
11−The `psc-ide` command is available for the [VS Code Purescript IDE extension](https://github.com/nwolverson/vscode-ide-purescript.git).
12−
13−```
14−[nix-shell:]$ code .
15−```
16−
17−## Build
18−
19−```
20−[nix-shell:]$ spago build
21−```
22−
23−## Test
24−
25−The test dependencies are specified seperately in `test.dhall`.
26−
27−```
28−[nix-shell:]$ spago -x test.dhall test
29−```
30−
31−## Publishing to Pursuit with `spago`
32−
33−[Publishing with `spago`](https://github.com/purescript/spago#publish-my-library).
34−
35−```
36−[nix-shell:]$ bower install --save
37−[nix-shell:]$ spago bump-version --no-dry-run major
38−[nix-shell:]$ pulp publish --no-push
39−```
40−
41−## Bower
42−
43−The `bower.json` is generated by running `spago bump-version`, do not edit it.
README.md+18−13
@@ -1,7 +1,8 @@
1# purescript-arraybuffer-builder
1# purescript-arraybuffer-builder
2
2
3−[![CI](https://github.com/jamesdbrock/purescript-arraybuffer-builder/workflows/CI/badge.svg?branch=master)](https://github.com/jamesdbrock/purescript-arraybuffer-builder/actions)
3+[![CI](https://github.com/rowtype-yoga/purescript-arraybuffer-builder/workflows/CI/badge.svg?branch=master)](https://github.com/rowtype-yoga/purescript-arraybuffer-builder/actions)
4[![Pursuit](http://pursuit.purescript.org/packages/purescript-arraybuffer-builder/badge)](http://pursuit.purescript.org/packages/purescript-arraybuffer-builder/)
4[![Pursuit](http://pursuit.purescript.org/packages/purescript-arraybuffer-builder/badge)](http://pursuit.purescript.org/packages/purescript-arraybuffer-builder/)
5+[![Maintainer: jamesdbrock](https://img.shields.io/badge/maintainer-jamesdbrock-teal.svg)](https://github.com/jamesdbrock)
5
6
6
7
7[`ArrayBuffer`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer)
8[`ArrayBuffer`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer)
@@ -50,23 +51,26 @@ Encode a `String` as UTF8 with a length prefix into our `Builder`.
50
51
51We give this as an example, rather than supporting it in the library, because
52We give this as an example, rather than supporting it in the library, because
52it depends on
53it depends on
53−[`Data.TextEncoding.encodeUtf8`](https://pursuit.purescript.org/packages/purescript-text-encoding/docs/Data.TextEncoding#v:encodeUtf8).
54+[`Web.Encoding.TextEncoder`](https://pursuit.purescript.org/packages/purescript-web-encoding/docs/Web.Encoding.TextEncoder).
54
55
55```purescript
56```purescript
57+import Effect.Class (class MonadEffect, liftEffect)
58+import Data.UInt (fromInt)
59+import Data.ArrayBuffer.Types (ArrayBuffer(..))
56−import Data.ArrayBuffer.Builder (PutM, putArrayBuffer, execPut)
60+import Data.ArrayBuffer.Builder (PutM, putArrayBuffer, execPut, putUint32be)
57import Data.ArrayBuffer.Typed (buffer)
61import Data.ArrayBuffer.Typed (buffer)
58−import Data.TextEncoding (encodeUtf8)
59import Data.ArrayBuffer.ArrayBuffer (byteLength)
62import Data.ArrayBuffer.ArrayBuffer (byteLength)
63+import Web.Encoding.TextEncoder (new, TextEncoder, encode)
60
64
61putStringUtf8 :: forall m. MonadEffect m => String -> PutM m Unit
65putStringUtf8 :: forall m. MonadEffect m => String -> PutM m Unit
62putStringUtf8 s = do
66putStringUtf8 s = do
67+ textEncoder <- liftEffect new
63− let stringbuf = buffer $ encodeUtf8 s
68+ let stringbuf = buffer $ encode s textEncoder
64− -- Put a 32-bit big-endian length prefix for the length of the utf8 string, in bytes.
69+ -- Put a 32-bit big-endian length for the utf8 string, in bytes.
65− putInt32be $ byteLength stringbuf
70+ putUint32be $ fromInt $ byteLength stringbuf
66 putArrayBuffer stringbuf
71 putArrayBuffer stringbuf
67
72
68−do
69− arraybuffer :: ArrayBuffer <- execPut $ putStringUtf8 "BLM"
73+arraybuffer :: ArrayBuffer <- execPut $ putStringUtf8 "🦝"
70```
74```
71
75
72### Serialize an `Array Int`
76### Serialize an `Array Int`
@@ -85,7 +89,7 @@ import Data.Array (length)
85
89
86putArrayInt32 :: forall m. MonadEffect m => Array Int -> PutM m Unit
90putArrayInt32 :: forall m. MonadEffect m => Array Int -> PutM m Unit
87putArrayInt32 xs = do
91putArrayInt32 xs = do
88− -- Put a 64-bit big-endian length prefix for the length of the array.
92+ -- Put a 64-bit big-endian length prefix for the array.
89 putInt32be 0
93 putInt32be 0
90 putInt32be $ length xs
94 putInt32be $ length xs
91 traverse_ putInt32be xs
95 traverse_ putInt32be xs
@@ -105,7 +109,7 @@ import Data.Array (foldRecM)
105
109
106putArrayInt32 :: forall m. MonadEffect m => MonadRec m => Array Int -> PutM m Unit
110putArrayInt32 :: forall m. MonadEffect m => MonadRec m => Array Int -> PutM m Unit
107putArrayInt32 xs = do
111putArrayInt32 xs = do
108− -- Put a 64-bit big-endian length prefix for the length of the array.
112+ -- Put a 64-bit big-endian length prefix for the array.
109 putInt32be 0
113 putInt32be 0
110 putInt32be $ length xs
114 putInt32be $ length xs
111 foldRecM (\_ x -> putInt32be x) unit xs
115 foldRecM (\_ x -> putInt32be x) unit xs
@@ -120,7 +124,7 @@ of the `PutM` builder expression are stack-safe.
120
124
121This package is only for writing `ArrayBuffer`s, not reading them.
125This package is only for writing `ArrayBuffer`s, not reading them.
122See
126See
123−[__purescript-parsing-dataview__](https://pursuit.purescript.org/packages/purescript-parsing-dataview/)
127+[__parsing-dataview__](https://pursuit.purescript.org/packages/purescript-parsing-dataview/)
124for a way to deserialize from `ArrayBuffer` back to Purescript data.
128for a way to deserialize from `ArrayBuffer` back to Purescript data.
125
129
126## Alternative packages for serializing to an `ArrayBuffer`
130## Alternative packages for serializing to an `ArrayBuffer`
@@ -129,11 +133,12 @@ for a way to deserialize from `ArrayBuffer` back to Purescript data.
129* [__node-buffer__](https://pursuit.purescript.org/packages/purescript-node-buffer)
133* [__node-buffer__](https://pursuit.purescript.org/packages/purescript-node-buffer)
130* [__arraybuffer-class__](https://pursuit.purescript.org/packages/purescript-arraybuffer-class)
134* [__arraybuffer-class__](https://pursuit.purescript.org/packages/purescript-arraybuffer-class)
131* [__bytestrings__](https://pursuit.purescript.org/packages/purescript-bytestrings/)
135* [__bytestrings__](https://pursuit.purescript.org/packages/purescript-bytestrings/)
136+* [__array-builder__](https://pursuit.purescript.org/packages/purescript-array-builder)
132
137
133## Development
138## Development
134
139
135To run the tests,
140To run the tests,
136
141
137```shell
142```shell
138−spago -x test.dhall test
143+spago -x spago-dev.dhall test
139```
144```
bower.json+12−8
@@ -14,13 +14,17 @@
14 "output"
14 "output"
15 ],
15 ],
16 "dependencies": {
16 "dependencies": {
17− "purescript-arraybuffer": "^v11.0.1",
17+ "purescript-arraybuffer": "^v13.1.1",
18− "purescript-arraybuffer-types": "^v3.0.0",
18+ "purescript-arraybuffer-types": "^v3.0.2",
19− "purescript-effect": "^v3.0.0",
19+ "purescript-effect": "^v4.0.0",
20− "purescript-float32": "^v1.0.0",
20+ "purescript-float32": "^v2.0.0",
21+ "purescript-identity": "^v6.0.0",
22+ "purescript-lists": "^v7.0.0",
21− "purescript-maybe": "^v5.0.0",
23+ "purescript-maybe": "^v6.0.0",
24+ "purescript-newtype": "^v5.0.0",
22− "purescript-prelude": "^v5.0.1",
25+ "purescript-prelude": "^v6.0.1",
26+ "purescript-tailrec": "^v6.1.0",
23− "purescript-transformers": "^v5.1.0",
27+ "purescript-transformers": "^v6.0.0",
24− "purescript-uint": "^v6.0.3"
28+ "purescript-uint": "^v7.0.0"
25 }
29 }
26}
30}
packages.dhall+2−2
@@ -117,8 +117,8 @@ let additions =
117-------------------------------
117-------------------------------
118-}
118-}
119let upstream =
119let upstream =
120− https://raw.githubusercontent.com/purescript/package-sets/psc-0.15.0-20220502/src/packages.dhall
120+ https://raw.githubusercontent.com/purescript/package-sets/psc-0.15.4-20221209/src/packages.dhall
121− sha256:38d347aeba9fe6359c208abe87a5cecf1ffb14294f11ad19664ae35c59b6e29a
121+ sha256:b55c24bf585df4041ae6e87124cab7b35d474a9a77c9c3862ee6bf1dae618d72
122
122
123let overrides = {=}
123let overrides = {=}
124
124
psc-package.jsondeleted−16
@@ -1,16 +0,0 @@
1−{
2− "name": "purescript-arraybuffer-builder",
3− "set": "psc-0.14.1-20210429",
4− "source": "https://github.com/purescript/package-sets.git",
5− "depends": [
6− "prelude",
7− "effect",
8− "float32",
9− "maybe",
10− "prelude",
11− "transformers",
12− "uint",
13− "arraybuffer-types",
14− "arraybuffer"
15− ]
16−}
shell.nixdeleted−30
@@ -1,30 +0,0 @@
1−# Universal shell for PureScript repos
2−# { pkgs ? import <nixpkgs> { }
3−{ pkgs ? import (builtins.fetchGit {
4− # https://github.com/NixOS/nixpkgs/releases/tag/20.09
5− url = "https://github.com/nixos/nixpkgs/";
6− ref = "refs/tags/20.09";
7− rev = "cd63096d6d887d689543a0b97743d28995bc9bc3";
8− }) {}
9−}:
10−let
11− easy-ps = import (builtins.fetchGit {
12− url = "https://github.com/justinwoo/easy-purescript-nix.git";
13− rev = "bbef4245cd6810ea84e97a47c801947bfec9fadc";
14− }) { inherit pkgs; };
15−in
16−pkgs.mkShell {
17− nativeBuildInputs = [
18− easy-ps.purs-0_14_3
19− easy-ps.spago
20− easy-ps.pulp
21− easy-ps.psc-package
22− pkgs.nodejs-14_x
23− pkgs.nodePackages.bower
24− ];
25− LC_ALL = "C.UTF-8"; # https://github.com/purescript/spago/issues/507
26− # https://github.com/purescript/spago#install-autocompletions-for-bash
27− shellHook = ''
28− source <(spago --bash-completion-script `which spago`)
29− '';
30−}
test.dhall → spago-dev.dhallrenamed+1
@@ -15,5 +15,6 @@ in conf //
15 , dependencies = conf.dependencies #
15 , dependencies = conf.dependencies #
16 [ "assert"
16 [ "assert"
17 , "arrays"
17 , "arrays"
18+ , "web-encoding"
18 ]
19 ]
19 }
20 }
src/Data/ArrayBuffer/Builder.purs+26−27
@@ -5,36 +5,35 @@
5-- | Writing to an `ArrayBuffer` is an `Effect`ful activity, so most
5-- | Writing to an `ArrayBuffer` is an `Effect`ful activity, so most
6-- | functions in this module must be run in a `MonadEffect` context.
6-- | functions in this module must be run in a `MonadEffect` context.
7-- |
7-- |
8−-- | For operations for working with `ArrayBuffer`, see
8+-- | For other operations for working with `ArrayBuffer`, see
9-- | module
9-- | module
10-- | [`Data.ArrayBuffer.ArrayBuffer`](https://pursuit.purescript.org/packages/purescript-arraybuffer/docs/Data.ArrayBuffer.ArrayBuffer)
10-- | [`Data.ArrayBuffer.ArrayBuffer`](https://pursuit.purescript.org/packages/purescript-arraybuffer/docs/Data.ArrayBuffer.ArrayBuffer)
11−-- | in package __purescript-arraybuffer__.
11+-- | in package __arraybuffer__.
12module Data.ArrayBuffer.Builder
12module Data.ArrayBuffer.Builder
13−( PutM
13+ ( PutM
14−, Put
14+ , Put
15−, execPutM
15+ , execPutM
16−, execPut
16+ , execPut
17−, subBuilder
17+ , subBuilder
18−, putArrayBuffer
18+ , putArrayBuffer
19−, putDataView
19+ , putDataView
20−, putDataBuff
20+ , putDataBuff
21−, putUint8
21+ , putUint8
22−, putInt8
22+ , putInt8
23−, putUint16be
23+ , putUint16be
24−, putUint16le
24+ , putUint16le
25−, putInt16be
25+ , putInt16be
26−, putInt16le
26+ , putInt16le
27−, putUint32be
27+ , putUint32be
28−, putUint32le
28+ , putUint32le
29−, putInt32be
29+ , putInt32be
30−, putInt32le
30+ , putInt32le
31−, putFloat32be
31+ , putFloat32be
32−, putFloat32le
32+ , putFloat32le
33−, putFloat64be
33+ , putFloat64be
34−, putFloat64le
34+ , putFloat64le
35−, module Data.ArrayBuffer.Builder.Internal
35+ , module Data.ArrayBuffer.Builder.Internal
36−)
37−where
36+ ) where
38
37
39import Prelude
38import Prelude
40
39
src/Data/ArrayBuffer/Internal.purs+46−44
@@ -79,33 +79,32 @@
79-- | so that if we want to change the `Builder` implementation later then we can.
79-- | so that if we want to change the `Builder` implementation later then we can.
80-- |
80-- |
81module Data.ArrayBuffer.Builder.Internal
81module Data.ArrayBuffer.Builder.Internal
82−( Builder(..)
82+ ( Builder(..)
83−, (<>>)
83+ , (<>>)
84−, DataBuff(..)
84+ , DataBuff(..)
85−, toView
85+ , toView
86−, execBuilder
86+ , execBuilder
87−, length
87+ , length
88−, foldl
88+ , foldl
89−, foldM
89+ , foldM
90−, singleton
90+ , singleton
91−, cons
91+ , cons
92−, snoc
92+ , snoc
93−, encodeUint8
93+ , encodeUint8
94−, encodeInt8
94+ , encodeInt8
95−, encodeUint16be
95+ , encodeUint16be
96−, encodeUint16le
96+ , encodeUint16le
97−, encodeInt16be
97+ , encodeInt16be
98−, encodeInt16le
98+ , encodeInt16le
99−, encodeUint32be
99+ , encodeUint32be
100−, encodeUint32le
100+ , encodeUint32le
101−, encodeInt32be
101+ , encodeInt32be
102−, encodeInt32le
102+ , encodeInt32le
103−, encodeFloat32be
103+ , encodeFloat32be
104−, encodeFloat32le
104+ , encodeFloat32le
105−, encodeFloat64be
105+ , encodeFloat64be
106−, encodeFloat64le
106+ , encodeFloat64le
107−)
108−where
107+ ) where
109
108
110import Prelude
109import Prelude
111
110
@@ -131,7 +130,7 @@ data DataBuff
131-- Concerning DataViews.
130-- Concerning DataViews.
132-- https://v8.dev/blog/dataview
131-- https://v8.dev/blog/dataview
133
132
134− -- | View the contents of `DataBuff` as a `DataView`.
133+-- | View the contents of `DataBuff` as a `DataView`.
135toView :: DataBuff -> DataView
134toView :: DataBuff -> DataView
136toView (Buff ab) = DV.whole ab
135toView (Buff ab) = DV.whole ab
137toView (View dv) = dv
136toView (View dv) = dv
@@ -191,11 +190,12 @@ instance semigroupBuilder :: Semigroup Builder where
191 append Null r = r
190 append Null r = r
192 append l (Node Null rx rr) = Node l rx rr -- this is the snoc case
191 append l (Node Null rx rr) = Node l rx rr -- this is the snoc case
193 append (Node ll lx Null) r = Node ll lx r -- found the rightmost Null
192 append (Node ll lx Null) r = Node ll lx r -- found the rightmost Null
194− -- of the left tree
193+ -- of the left tree
195 append (Node ll lx lr) r = Node ll lx $ append lr r -- search down the right
194 append (Node ll lx lr) r = Node ll lx $ append lr r -- search down the right
195+
196− -- side of the left tree
196+-- side of the left tree
197− -- to find the rightmost
197+-- to find the rightmost
198− -- Null
198+-- Null
199
199
200infixl 5 append as <>>
200infixl 5 append as <>>
201
201
@@ -211,18 +211,18 @@ foldM :: forall m a. MonadRec m => (a -> DataBuff -> m a) -> a -> Builder -> m a
211-- The Art of Computer Programming 2.3.1
211-- The Art of Computer Programming 2.3.1
212-- Inorder traversal using a stack
212-- Inorder traversal using a stack
213-- https://yuyuan.org/MorrisAlgorithm/
213-- https://yuyuan.org/MorrisAlgorithm/
214−foldM f a0 b = tailRecM outer {p: b, stack: Nil, accum: a0}
214+foldM f a0 b = tailRecM outer { p: b, stack: Nil, accum: a0 }
215 where
215 where
216− outer {p,stack,accum} = do
216+ outer { p, stack, accum } = do
217− stack' <- tailRecM inner {p_:p,stack_:stack}
217+ stack' <- tailRecM inner { p_: p, stack_: stack }
218 case uncons stack' of
218 case uncons stack' of
219 Nothing -> pure $ Done accum
219 Nothing -> pure $ Done accum
220− Just {head: Node _ x r, tail} -> do
220+ Just { head: Node _ x r, tail } -> do
221 accum' <- f accum x
221 accum' <- f accum x
222− pure $ Loop {p: r, stack: tail, accum: accum'}
222+ pure $ Loop { p: r, stack: tail, accum: accum' }
223− Just {head:Null} -> pure $ Done accum
223+ Just { head: Null } -> pure $ Done accum
224− inner {p_:Null,stack_} = pure $ Done stack_
224+ inner { p_: Null, stack_ } = pure $ Done stack_
225− inner {p_: n@(Node l _ _), stack_} = pure $ Loop {p_: l, stack_: n:stack_}
225+ inner { p_: n@(Node l _ _), stack_ } = pure $ Loop { p_: l, stack_: n : stack_ }
226
226
227-- | Construct a `Builder` with a single `DataBuff`. *O(1)*
227-- | Construct a `Builder` with a single `DataBuff`. *O(1)*
228singleton :: DataBuff -> Builder
228singleton :: DataBuff -> Builder
@@ -233,8 +233,8 @@ singleton buf = Node Null buf Null
233length :: Builder -> ByteLength
233length :: Builder -> ByteLength
234length bldr = foldl (\b a -> b + len a) 0 bldr
234length bldr = foldl (\b a -> b + len a) 0 bldr
235 where
235 where
236− len (Buff ab) = AB.byteLength ab
236+ len (Buff ab) = AB.byteLength ab
237− len (View dv) = DV.byteLength dv
237+ len (View dv) = DV.byteLength dv
238
238
239-- | Prepend a `DataBuff` to the beginning of the `Builder`. *O(1)*
239-- | Prepend a `DataBuff` to the beginning of the `Builder`. *O(1)*
240cons :: DataBuff -> Builder -> Builder
240cons :: DataBuff -> Builder -> Builder
@@ -259,9 +259,11 @@ execBuilder bldr = do
259 aview <- liftEffect $ toUint8Array a
259 aview <- liftEffect $ toUint8Array a
260 _ <- liftEffect $ AT.setTyped newview (Just offset) aview
260 _ <- liftEffect $ AT.setTyped newview (Just offset) aview
261 pure $ offset + AT.byteLength aview
261 pure $ offset + AT.byteLength aview
262+ )
263+ 0
262− ) 0 bldr
264+ bldr
263 pure buf
265 pure buf
264− where
266+ where
265 toUint8Array :: DataBuff -> Effect Uint8Array
267 toUint8Array :: DataBuff -> Effect Uint8Array
266 toUint8Array (Buff ab) = AT.whole ab
268 toUint8Array (Buff ab) = AT.whole ab
267 toUint8Array (View dv) =
269 toUint8Array (View dv) =
test/Main.purs+44−19
@@ -2,18 +2,23 @@ module Test.Main where
2
2
3import Prelude
3import Prelude
4
4
5−import Control.Monad.Rec.Class (Step(..), tailRecM)
6import Control.Monad.Writer.Trans (tell)
5import Control.Monad.Writer.Trans (tell)
7import Data.Array (foldRecM)
6import Data.Array (foldRecM)
8import Data.Array as Array
7import Data.Array as Array
8+import Data.ArrayBuffer.ArrayBuffer (byteLength)
9−import Data.ArrayBuffer.Builder (Builder, DataBuff(..), PutM, execPut, putInt16be, putInt32le, putInt8, subBuilder)
9+import Data.ArrayBuffer.Builder (Builder, DataBuff(..), PutM, execPut, putArrayBuffer, putInt16be, putInt32be, putInt32le, putInt8, subBuilder)
10import Data.ArrayBuffer.Builder.Internal (cons, encodeInt8, execBuilder, length, singleton, (<>>))
10import Data.ArrayBuffer.Builder.Internal (cons, encodeInt8, execBuilder, length, singleton, (<>>))
11import Data.ArrayBuffer.DataView as DV
11import Data.ArrayBuffer.DataView as DV
12+import Data.ArrayBuffer.Typed (buffer)
12import Data.ArrayBuffer.Typed as AT
13import Data.ArrayBuffer.Typed as AT
13−import Data.ArrayBuffer.Types (ArrayBuffer, Uint8Array)
14+import Data.ArrayBuffer.Typed as AV
15+import Data.ArrayBuffer.Types (ArrayBuffer, Uint8Array, Int8Array)
14import Data.UInt as UInt
16import Data.UInt as UInt
15import Effect (Effect)
17import Effect (Effect)
18+import Effect.Class (class MonadEffect, liftEffect)
16import Test.Assert (assertEqual')
19import Test.Assert (assertEqual')
20+import Web.Encoding.TextEncoder (encode)
21+import Web.Encoding.TextEncoder as TextEncoder
17
22
18asBytes :: ArrayBuffer -> Effect (Array Int)
23asBytes :: ArrayBuffer -> Effect (Array Int)
19asBytes x = do
24asBytes x = do
@@ -23,48 +28,48 @@ asBytes x = do
23putTest :: String -> Array Int -> PutM Effect Unit -> Effect Unit
28putTest :: String -> Array Int -> PutM Effect Unit -> Effect Unit
24putTest label expected put = do
29putTest label expected put = do
25 actual <- asBytes =<< execPut put
30 actual <- asBytes =<< execPut put
26− assertEqual' label {actual,expected}
31+ assertEqual' label { actual, expected }
27
32
28buildTest :: String -> Array Int -> Effect Builder -> Effect Unit
33buildTest :: String -> Array Int -> Effect Builder -> Effect Unit
29buildTest label expected bldr = do
34buildTest label expected bldr = do
30 actual <- asBytes =<< execBuilder =<< bldr
35 actual <- asBytes =<< execBuilder =<< bldr
31− assertEqual' label {actual,expected}
36+ assertEqual' label { actual, expected }
32
37
33main :: Effect Unit
38main :: Effect Unit
34main = do
39main = do
35− putTest "Test 0" [6,7,8] do
40+ putTest "Test 0" [ 6, 7, 8 ] do
36 putInt8 6
41 putInt8 6
37 putInt8 7
42 putInt8 7
38 putInt8 8
43 putInt8 8
39
44
40− putTest "Test 1" [255,254] do
45+ putTest "Test 1" [ 255, 254 ] do
41 putInt16be (-2)
46 putInt16be (-2)
42
47
43− putTest "Test 3" [3,0,0,0] do
48+ putTest "Test 3" [ 3, 0, 0, 0 ] do
44 putInt32le 3
49 putInt32le 3
45
50
46− buildTest "Test 4" [1,2,3,4] do
51+ buildTest "Test 4" [ 1, 2, 3, 4 ] do
47 b1 <- Buff <$> encodeInt8 1
52 b1 <- Buff <$> encodeInt8 1
48 b2 <- Buff <$> encodeInt8 2
53 b2 <- Buff <$> encodeInt8 2
49 b3 <- Buff <$> encodeInt8 3
54 b3 <- Buff <$> encodeInt8 3
50 b4 <- Buff <$> encodeInt8 4
55 b4 <- Buff <$> encodeInt8 4
51 pure $ singleton b1 <> singleton b2 <> singleton b3 <> singleton b4
56 pure $ singleton b1 <> singleton b2 <> singleton b3 <> singleton b4
52
57
53− buildTest "Test 5" [1,2,3,4] do
58+ buildTest "Test 5" [ 1, 2, 3, 4 ] do
54 b1 <- Buff <$> encodeInt8 1
59 b1 <- Buff <$> encodeInt8 1
55 b2 <- Buff <$> encodeInt8 2
60 b2 <- Buff <$> encodeInt8 2
56 b3 <- Buff <$> encodeInt8 3
61 b3 <- Buff <$> encodeInt8 3
57 b4 <- Buff <$> encodeInt8 4
62 b4 <- Buff <$> encodeInt8 4
58 pure $ singleton b1 <>> singleton b2 <>> singleton b3 <>> singleton b4
63 pure $ singleton b1 <>> singleton b2 <>> singleton b3 <>> singleton b4
59
64
60− buildTest "Test 6" [1,2,3,4] do
65+ buildTest "Test 6" [ 1, 2, 3, 4 ] do
61 b1 <- Buff <$> encodeInt8 1
66 b1 <- Buff <$> encodeInt8 1
62 b2 <- Buff <$> encodeInt8 2
67 b2 <- Buff <$> encodeInt8 2
63 b3 <- Buff <$> encodeInt8 3
68 b3 <- Buff <$> encodeInt8 3
64 b4 <- Buff <$> encodeInt8 4
69 b4 <- Buff <$> encodeInt8 4
65 pure $ singleton b1 <> (singleton b2 <> singleton b3) <> singleton b4
70 pure $ singleton b1 <> (singleton b2 <> singleton b3) <> singleton b4
66
71
67− buildTest "Test 6" [1,2,3,4,5,6,7,8] do
72+ buildTest "Test 6" [ 1, 2, 3, 4, 5, 6, 7, 8 ] do
68 b1 <- Buff <$> encodeInt8 1
73 b1 <- Buff <$> encodeInt8 1
69 b2 <- Buff <$> encodeInt8 2
74 b2 <- Buff <$> encodeInt8 2
70 b3 <- Buff <$> encodeInt8 3
75 b3 <- Buff <$> encodeInt8 3
@@ -74,9 +79,11 @@ main = do
74 b7 <- Buff <$> encodeInt8 7
79 b7 <- Buff <$> encodeInt8 7
75 b8 <- Buff <$> encodeInt8 8
80 b8 <- Buff <$> encodeInt8 8
76 pure $ singleton b1 <> (singleton b2 <> singleton b3) <> singleton b4
81 pure $ singleton b1 <> (singleton b2 <> singleton b3) <> singleton b4
82+ <> singleton b5
77− <> singleton b5 <> (singleton b6 <> singleton b7) <> singleton b8
83+ <> (singleton b6 <> singleton b7)
84+ <> singleton b8
78
85
79− buildTest "Test 7" [1,2,3,4,5,6,7,8] do
86+ buildTest "Test 7" [ 1, 2, 3, 4, 5, 6, 7, 8 ] do
80 b1 <- Buff <$> encodeInt8 1
87 b1 <- Buff <$> encodeInt8 1
81 b2 <- Buff <$> encodeInt8 2
88 b2 <- Buff <$> encodeInt8 2
82 b3 <- Buff <$> encodeInt8 3
89 b3 <- Buff <$> encodeInt8 3
@@ -86,16 +93,16 @@ main = do
86 b7 <- Buff <$> encodeInt8 7
93 b7 <- Buff <$> encodeInt8 7
87 b8 <- Buff <$> encodeInt8 8
94 b8 <- Buff <$> encodeInt8 8
88 pure $ ((singleton b1 <> singleton b2) <> (singleton b3 <> singleton b4))
95 pure $ ((singleton b1 <> singleton b2) <> (singleton b3 <> singleton b4))
89− <> ((singleton b5 <> singleton b6) <> (singleton b7 <> singleton b8))
96+ <> ((singleton b5 <> singleton b6) <> (singleton b7 <> singleton b8))
90
97
91− buildTest "Test 8" [1,2,3,4] do
98+ buildTest "Test 8" [ 1, 2, 3, 4 ] do
92 b1 <- Buff <$> encodeInt8 1
99 b1 <- Buff <$> encodeInt8 1
93 b2 <- Buff <$> encodeInt8 2
100 b2 <- Buff <$> encodeInt8 2
94 b3 <- Buff <$> encodeInt8 3
101 b3 <- Buff <$> encodeInt8 3
95 b4 <- Buff <$> encodeInt8 4
102 b4 <- Buff <$> encodeInt8 4
96 pure $ (cons b1 (singleton b2)) <> (cons b3 (singleton b4))
103 pure $ (cons b1 (singleton b2)) <> (cons b3 (singleton b4))
97
104
98− putTest "Test 9" [1,2,2,3,4] do
105+ putTest "Test 9" [ 1, 2, 2, 3, 4 ] do
99 x <- subBuilder do
106 x <- subBuilder do
100 putInt8 3
107 putInt8 3
101 putInt8 4
108 putInt8 4
@@ -104,7 +111,7 @@ main = do
104 putInt8 $ length x
111 putInt8 $ length x
105 tell x
112 tell x
106
113
107− buildTest "Test 10" [1,2,3,4,5,6,7,8] do
114+ buildTest "Test 10" [ 1, 2, 3, 4, 5, 6, 7, 8 ] do
108 b1 <- View <$> DV.whole <$> encodeInt8 1
115 b1 <- View <$> DV.whole <$> encodeInt8 1
109 b2 <- View <$> DV.whole <$> encodeInt8 2
116 b2 <- View <$> DV.whole <$> encodeInt8 2
110 b3 <- View <$> DV.whole <$> encodeInt8 3
117 b3 <- View <$> DV.whole <$> encodeInt8 3
@@ -114,8 +121,26 @@ main = do
114 b7 <- View <$> DV.whole <$> encodeInt8 7
121 b7 <- View <$> DV.whole <$> encodeInt8 7
115 b8 <- View <$> DV.whole <$> encodeInt8 8
122 b8 <- View <$> DV.whole <$> encodeInt8 8
116 pure $ ((singleton b1 <> singleton b2) <> (singleton b3 <> singleton b4))
123 pure $ ((singleton b1 <> singleton b2) <> (singleton b3 <> singleton b4))
117− <> ((singleton b5 <> singleton b6) <> (singleton b7 <> singleton b8))
124+ <> ((singleton b5 <> singleton b6) <> (singleton b7 <> singleton b8))
118
125
119 let stackblower = Array.replicate 20000 2
126 let stackblower = Array.replicate 20000 2
120 putTest "Stack test" stackblower do
127 putTest "Stack test" stackblower do
121 foldRecM (\_ x -> putInt8 x) unit stackblower
128 foldRecM (\_ x -> putInt8 x) unit stackblower
129+
130+ do
131+ let
132+ putStringUtf8 :: forall m. MonadEffect m => String -> PutM m Unit
133+ putStringUtf8 s = do
134+ textEncoder <- liftEffect TextEncoder.new
135+ let stringbuf = buffer $ encode s textEncoder
136+ -- Put a 32-bit big-endian length prefix for the length of the utf8 string, in bytes.
137+ putInt32be $ byteLength stringbuf
138+ putArrayBuffer stringbuf
139+
140+ arraybuffer :: ArrayBuffer <- execPut $ putStringUtf8 "🦝"
141+ view :: Int8Array <- AV.whole arraybuffer
142+ viewarray <- AV.toArray view
143+ assertEqual' "utf-8 test"
144+ { actual: viewarray
145+ , expected: [ 0, 0, 0, 4, -16, -97, -90, -99 ]
146+ }