From f9c494b08e8a77763a8e4526f38a41b271920e6f Mon Sep 17 00:00:00 2001 From: htoooth Date: Fri, 12 Sep 2025 17:41:31 +0800 Subject: [PATCH 01/10] Stdlib: add DataView with littleEndian get/set --- .../@rescript/runtime/Stdlib_DataView.res | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/packages/@rescript/runtime/Stdlib_DataView.res b/packages/@rescript/runtime/Stdlib_DataView.res index 2c0ccd91bf..16f6399969 100644 --- a/packages/@rescript/runtime/Stdlib_DataView.res +++ b/packages/@rescript/runtime/Stdlib_DataView.res @@ -13,29 +13,57 @@ external fromBufferWithRange: (Stdlib_ArrayBuffer.t, ~byteOffset: int, ~length: @send external getInt8: (t, int) => int = "getInt8" @send external getUint8: (t, int) => int = "getUint8" + @send external getInt16: (t, int) => int = "getInt16" +@send external getInt16LittleEndian: (t, int, @as(1) _) => int = "getInt16" + @send external getUint16: (t, int) => int = "getUint16" +@send external getUint16LittleEndian: (t, int, @as(1) _) => int = "getUint16" + @send external getInt32: (t, int) => int = "getInt32" +@send external getInt32LittleEndian: (t, int, @as(1) _) => int = "getInt32" + @send external getUint32: (t, int) => int = "getUint32" +@send external getUint32LittleEndian: (t, int, @as(1) _) => int = "getUint32" @send external getFloat32: (t, int) => float = "getFloat32" +@send external getFloat32LittleEndian: (t, int, @as(1) _) => float = "getFloat32" + @send external getFloat64: (t, int) => float = "getFloat64" +@send external getFloat64LittleEndian: (t, int, @as(1) _) => float = "getFloat64" @send external getBigInt64: (t, int) => bigint = "getBigInt64" +@send external getBigInt64LittleEndian: (t, int, @as(1) _) => bigint = "getBigInt64" + @send external getBigUint64: (t, int) => bigint = "getBigUint64" +@send external getBigUint64LittleEndian: (t, int, @as(1) _) => bigint = "getBigUint64" @send external setInt8: (t, int, int) => unit = "setInt8" @send external setUint8: (t, int, int) => unit = "setUint8" + @send external setInt16: (t, int, int) => unit = "setInt16" +@send external setInt16LittleEndian: (t, int, int, @as(1) _) => unit = "setInt16" + @send external setUint16: (t, int, int) => unit = "setUint16" +@send external setUint16LittleEndian: (t, int, int, @as(1) _) => unit = "setUint16" + @send external setInt32: (t, int, int) => unit = "setInt32" +@send external setInt32LittleEndian: (t, int, int, @as(1) _) => unit = "setInt32" + @send external setUint32: (t, int, int) => unit = "setUint32" +@send external setUint32LittleEndian: (t, int, int, @as(1) _) => unit = "setUint32" @send external setFloat32: (t, int, float) => unit = "setFloat32" +@send external setFloat32LittleEndian: (t, int, float, @as(1) _) => unit = "setFloat32" + @send external setFloat64: (t, int, float) => unit = "setFloat64" +@send external setFloat64LittleEndian: (t, int, float, @as(1) _) => unit = "setFloat64" @send external setBigInt64: (t, int, bigint) => unit = "setBigInt64" +@send external setBigInt64LittleEndian: (t, int, bigint, @as(1) _) => unit = "setBigInt64" + @send external setBigUint64: (t, int, bigint) => unit = "setBigUint64" +@send external setBigUint64LittleEndian: (t, int, bigint, @as(1) _) => unit = "setBigUint64" /** `ignore(dataView)` ignores the provided dataView and returns unit. From af3e1d2aff31eeedee7f637a5892d7c38605dc37 Mon Sep 17 00:00:00 2001 From: htoooth Date: Sat, 13 Sep 2025 02:15:17 +0000 Subject: [PATCH 02/10] Stdlib: refactor DataView methods to support optional little-endian parameter --- .../@rescript/runtime/Stdlib_DataView.res | 58 +-- .../@rescript/runtime/Stdlib_DataView.resi | 422 ++++++++++++++++++ 2 files changed, 440 insertions(+), 40 deletions(-) create mode 100644 packages/@rescript/runtime/Stdlib_DataView.resi diff --git a/packages/@rescript/runtime/Stdlib_DataView.res b/packages/@rescript/runtime/Stdlib_DataView.res index 16f6399969..4ec93c81ff 100644 --- a/packages/@rescript/runtime/Stdlib_DataView.res +++ b/packages/@rescript/runtime/Stdlib_DataView.res @@ -14,56 +14,34 @@ external fromBufferWithRange: (Stdlib_ArrayBuffer.t, ~byteOffset: int, ~length: @send external getInt8: (t, int) => int = "getInt8" @send external getUint8: (t, int) => int = "getUint8" -@send external getInt16: (t, int) => int = "getInt16" -@send external getInt16LittleEndian: (t, int, @as(1) _) => int = "getInt16" +@send external getInt16: (t, int, ~littleEndian: bool=?) => int = "getInt16" +@send external getUint16: (t, int, ~littleEndian: bool=?) => int = "getUint16" -@send external getUint16: (t, int) => int = "getUint16" -@send external getUint16LittleEndian: (t, int, @as(1) _) => int = "getUint16" +@send external getInt32: (t, int, ~littleEndian: bool=?) => int = "getInt32" +@send external getUint32: (t, int, ~littleEndian: bool=?) => int = "getUint32" -@send external getInt32: (t, int) => int = "getInt32" -@send external getInt32LittleEndian: (t, int, @as(1) _) => int = "getInt32" +@send external getFloat16: (t, int, ~littleEndian: bool=?) => float = "getFloat16" +@send external getFloat32: (t, int, ~littleEndian: bool=?) => float = "getFloat32" +@send external getFloat64: (t, int, ~littleEndian: bool=?) => float = "getFloat64" -@send external getUint32: (t, int) => int = "getUint32" -@send external getUint32LittleEndian: (t, int, @as(1) _) => int = "getUint32" - -@send external getFloat32: (t, int) => float = "getFloat32" -@send external getFloat32LittleEndian: (t, int, @as(1) _) => float = "getFloat32" - -@send external getFloat64: (t, int) => float = "getFloat64" -@send external getFloat64LittleEndian: (t, int, @as(1) _) => float = "getFloat64" - -@send external getBigInt64: (t, int) => bigint = "getBigInt64" -@send external getBigInt64LittleEndian: (t, int, @as(1) _) => bigint = "getBigInt64" - -@send external getBigUint64: (t, int) => bigint = "getBigUint64" -@send external getBigUint64LittleEndian: (t, int, @as(1) _) => bigint = "getBigUint64" +@send external getBigInt64: (t, int, ~littleEndian: bool=?) => bigint = "getBigInt64" +@send external getBigUint64: (t, int, ~littleEndian: bool=?) => bigint = "getBigUint64" @send external setInt8: (t, int, int) => unit = "setInt8" @send external setUint8: (t, int, int) => unit = "setUint8" -@send external setInt16: (t, int, int) => unit = "setInt16" -@send external setInt16LittleEndian: (t, int, int, @as(1) _) => unit = "setInt16" - -@send external setUint16: (t, int, int) => unit = "setUint16" -@send external setUint16LittleEndian: (t, int, int, @as(1) _) => unit = "setUint16" - -@send external setInt32: (t, int, int) => unit = "setInt32" -@send external setInt32LittleEndian: (t, int, int, @as(1) _) => unit = "setInt32" - -@send external setUint32: (t, int, int) => unit = "setUint32" -@send external setUint32LittleEndian: (t, int, int, @as(1) _) => unit = "setUint32" - -@send external setFloat32: (t, int, float) => unit = "setFloat32" -@send external setFloat32LittleEndian: (t, int, float, @as(1) _) => unit = "setFloat32" +@send external setInt16: (t, int, int, ~littleEndian: bool=?) => unit = "setInt16" +@send external setUint16: (t, int, int, ~littleEndian: bool=?) => unit = "setUint16" -@send external setFloat64: (t, int, float) => unit = "setFloat64" -@send external setFloat64LittleEndian: (t, int, float, @as(1) _) => unit = "setFloat64" +@send external setInt32: (t, int, int, ~littleEndian: bool=?) => unit = "setInt32" +@send external setUint32: (t, int, int, ~littleEndian: bool=?) => unit = "setUint32" -@send external setBigInt64: (t, int, bigint) => unit = "setBigInt64" -@send external setBigInt64LittleEndian: (t, int, bigint, @as(1) _) => unit = "setBigInt64" +@send external setFloat16: (t, int, float, ~littleEndian: bool=?) => unit = "setFloat16" +@send external setFloat32: (t, int, float, ~littleEndian: bool=?) => unit = "setFloat32" +@send external setFloat64: (t, int, float, ~littleEndian: bool=?) => unit = "setFloat64" -@send external setBigUint64: (t, int, bigint) => unit = "setBigUint64" -@send external setBigUint64LittleEndian: (t, int, bigint, @as(1) _) => unit = "setBigUint64" +@send external setBigInt64: (t, int, bigint, ~littleEndian: bool=?) => unit = "setBigInt64" +@send external setBigUint64: (t, int, bigint, ~littleEndian: bool=?) => unit = "setBigUint64" /** `ignore(dataView)` ignores the provided dataView and returns unit. diff --git a/packages/@rescript/runtime/Stdlib_DataView.resi b/packages/@rescript/runtime/Stdlib_DataView.resi new file mode 100644 index 0000000000..bef27ad196 --- /dev/null +++ b/packages/@rescript/runtime/Stdlib_DataView.resi @@ -0,0 +1,422 @@ +/* Copyright (C) 2015-2016 Bloomberg Finance L.P. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * In addition to the permissions granted to you by the LGPL, you may combine + * or link a "work that uses the Library" with a publicly distributed version + * of this file to produce a combined library or application, then distribute + * that combined work under the terms of your choosing, with no requirement + * to comply with the obligations normally placed on you by section 4 of the + * LGPL version 3 (or the corresponding section of a later version of the LGPL + * should you choose to use a later version). + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/*** +Functions for interacting with DataView. + +See [`DataView`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView) on MDN. +*/ + +/** +Type representing a DataView. +*/ +@notUndefined +type t + +/** +`fromBuffer(buffer)` creates a DataView for the entire ArrayBuffer. + +See [`DataView`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView) on MDN. + +## Examples + +```rescript +let dv = DataView.fromBuffer(buffer) +``` +*/ +@new external fromBuffer: Stdlib_ArrayBuffer.t => t = "DataView" + +/** +`fromBufferToEnd(buffer, ~byteOffset)` creates a DataView starting at a given byte offset. + +See [`DataView`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView) on MDN. + +## Examples + +```rescript +let dv = DataView.fromBufferToEnd(buffer, ~byteOffset=4) +``` +*/ +@new external fromBufferToEnd: (Stdlib_ArrayBuffer.t, ~byteOffset: int) => t = "DataView" + +/** +`fromBufferWithRange(buffer, ~byteOffset, ~length)` creates a DataView for a specific byte range. + +See [`DataView`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView) on MDN. + +## Examples + +```rescript +let dv = DataView.fromBufferWithRange(buffer, ~byteOffset=2, ~length=8) +``` +*/ +@new external fromBufferWithRange: (Stdlib_ArrayBuffer.t, ~byteOffset: int, ~length: int) => t = "DataView" + +/** +`buffer(dataView)` returns the underlying ArrayBuffer referenced by this DataView. + +See [`DataView.buffer`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/buffer) on MDN. + +## Examples + +```rescript +let arrBuf = DataView.buffer(dv) +``` +*/ +@get external buffer: t => Stdlib_ArrayBuffer.t = "buffer" + +/** +`byteLength(dataView)` returns the length (in bytes) of this DataView. + +See [`DataView.byteLength`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/byteLength) on MDN. + +## Examples + +```rescript +let len = DataView.byteLength(dv) +``` +*/ +@get external byteLength: t => int = "byteLength" + +/** +`byteOffset(dataView)` returns the byte offset of this DataView from the start of its ArrayBuffer. + +See [`DataView.byteOffset`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/byteOffset) on MDN. + +## Examples + +```rescript +let offset = DataView.byteOffset(dv) +``` +*/ +@get external byteOffset: t => int = "byteOffset" + +/** +`getInt8(dataView, offset)` reads an 8-bit signed integer at the specified byte offset. + +See [`DataView.getInt8`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getInt8) on MDN. + +## Examples + +```rescript +let v = DataView.getInt8(dv, 0) +``` +*/ +@send external getInt8: (t, int, ~littleEndian: bool=?) => int = "getInt8" + +/** +`getUint8(dataView, offset)` reads an 8-bit unsigned integer at the specified byte offset. + +See [`DataView.getUint8`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getUint8) on MDN. + +## Examples + +```rescript +let v = DataView.getUint8(dv, 1) +``` +*/ +@send external getUint8: (t, int, ~littleEndian: bool=?) => int = "getUint8" + +/** +`getInt16(dataView, offset, ~littleEndian=?)` reads a 16-bit signed integer at the specified byte offset, with optional endianness. + +See [`DataView.getInt16`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getInt16) on MDN. + +## Examples + +```rescript +let v1 = DataView.getInt16(dv, 2) +let v2 = DataView.getInt16(dv, 2, ~littleEndian=true) +``` +*/ +@send external getInt16: (t, int, ~littleEndian: bool=?) => int = "getInt16" + +/** +`getUint16(dataView, offset, ~littleEndian=?)` reads a 16-bit unsigned integer at the specified byte offset, with optional endianness. + +See [`DataView.getUint16`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getUint16) on MDN. + +## Examples + +```rescript +let v1 = DataView.getUint16(dv, 2) +let v2 = DataView.getUint16(dv, 2, ~littleEndian=true) +``` +*/ +@send external getUint16: (t, int, ~littleEndian: bool=?) => int = "getUint16" + +/** +`getInt32(dataView, offset, ~littleEndian=?)` reads a 32-bit signed integer at the specified byte offset, with optional endianness. + +See [`DataView.getInt32`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getInt32) on MDN. + +## Examples + +```rescript +let v1 = DataView.getInt32(dv, 4) +let v2 = DataView.getInt32(dv, 4, ~littleEndian=true) +``` +*/ +@send external getInt32: (t, int, ~littleEndian: bool=?) => int = "getInt32" + +/** +`getUint32(dataView, offset, ~littleEndian=?)` reads a 32-bit unsigned integer at the specified byte offset, with optional endianness. + +See [`DataView.getUint32`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getUint32) on MDN. + +## Examples + +```rescript +let v1 = DataView.getUint32(dv, 4) +let v2 = DataView.getUint32(dv, 4, ~littleEndian=true) +``` +*/ +@send external getUint32: (t, int, ~littleEndian: bool=?) => int = "getUint32" + +/** +`getFloat16(dataView, offset, ~littleEndian=?)` reads a 16-bit floating point number (if supported) at the specified byte offset, with optional endianness. + +See [`DataView.getFloat16`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getFloat16) on MDN. + +## Examples +```rescript +let v1 = DataView.getFloat16(dv, 6) +let v2 = DataView.getFloat16(dv, 6, ~littleEndian=true) +``` +*/ +@send external getFloat16: (t, int, ~littleEndian: bool=?) => float = "getFloat16" + +/** +`getFloat32(dataView, offset, ~littleEndian=?)` reads a 32-bit floating point number at the specified byte offset, with optional endianness. + +See [`DataView.getFloat32`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getFloat32) on MDN. + +## Examples + +```rescript +let v1 = DataView.getFloat32(dv, 8) +let v2 = DataView.getFloat32(dv, 8, ~littleEndian=true) +``` +*/ +@send external getFloat32: (t, int, ~littleEndian: bool=?) => float = "getFloat32" + +/** +`getFloat64(dataView, offset, ~littleEndian=?)` reads a 64-bit floating point number at the specified byte offset, with optional endianness. + +See [`DataView.getFloat64`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getFloat64) on MDN. + +## Examples + +```rescript +let v1 = DataView.getFloat64(dv, 10) +let v2 = DataView.getFloat64(dv, 10, ~littleEndian=true) +``` +*/ +@send external getFloat64: (t, int, ~littleEndian: bool=?) => float = "getFloat64" + +/** +`getBigInt64(dataView, offset, ~littleEndian=?)` reads a 64-bit signed integer (BigInt) at the specified byte offset, with optional endianness. + +See [`DataView.getBigInt64`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getBigInt64) on MDN. + +## Examples +```rescript +let v1 = DataView.getBigInt64(dv, 12) +let v2 = DataView.getBigInt64(dv, 12, ~littleEndian=true) +``` +*/ +@send external getBigInt64: (t, int, ~littleEndian: bool=?) => bigint = "getBigInt64" + +/** +`getBigUint64(dataView, offset, ~littleEndian=?)` reads a 64-bit unsigned integer (BigInt) at the specified byte offset, with optional endianness. + +See [`DataView.getBigUint64`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getBigUint64) on MDN. + +## Examples + +```rescript +let v1 = DataView.getBigUint64(dv, 14) +let v2 = DataView.getBigUint64(dv, 14, ~littleEndian=true) +``` +*/ +@send external getBigUint64: (t, int, ~littleEndian: bool=?) => bigint = "getBigUint64" + +/** +`setInt8(dataView, offset, value)` writes an 8-bit signed integer at the specified byte offset. + +See [`DataView.setInt8`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setInt8) on MDN. + +## Examples + +```rescript +DataView.setInt8(dv, 0, -12) +``` +*/ +@send external setInt8: (t, int, int) => unit = "setInt8" + +/** +`setUint8(dataView, offset, value)` writes an 8-bit unsigned integer at the specified byte offset. + +See [`DataView.setUint8`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setUint8) on MDN. + +## Examples + +```rescript +DataView.setUint8(dv, 1, 255) +``` +*/ +@send external setUint8: (t, int, int) => unit = "setUint8" + +/** +`setInt16(dataView, offset, value, ~littleEndian=?)` writes a 16-bit signed integer at the specified byte offset, with optional endianness. + +See [`DataView.setInt16`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setInt16) on MDN. + +## Examples + +```rescript +DataView.setInt16(dv, 2, -1234) +DataView.setInt16(dv, 2, -1234, ~littleEndian=true) +``` +*/ +@send external setInt16: (t, int, int, ~littleEndian: bool=?) => unit = "setInt16" + +/** +`setUint16(dataView, offset, value, ~littleEndian=?)` writes a 16-bit unsigned integer at the specified byte offset, with optional endianness. + +See [`DataView.setUint16`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setUint16) on MDN. + +## Examples + +```rescript +DataView.setUint16(dv, 2, 1234) +DataView.setUint16(dv, 2, 1234, ~littleEndian=true) +``` +*/ +@send external setUint16: (t, int, int, ~littleEndian: bool=?) => unit = "setUint16" + +/** +`setInt32(dataView, offset, value, ~littleEndian=?)` writes a 32-bit signed integer at the specified byte offset, with optional endianness. + +See [`DataView.setInt32`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setInt32) on MDN. + +## Examples + +```rescript +DataView.setInt32(dv, 4, -123456) +DataView.setInt32(dv, 4, -123456, ~littleEndian=true) +``` +*/ +@send external setInt32: (t, int, int, ~littleEndian: bool=?) => unit = "setInt32" + +/** +`setUint32(dataView, offset, value, ~littleEndian=?)` writes a 32-bit unsigned integer at the specified byte offset, with optional endianness. + +See [`DataView.setUint32`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setUint32) on MDN. + +## Examples + +```rescript +DataView.setUint32(dv, 4, 123456) +DataView.setUint32(dv, 4, 123456, ~littleEndian=true) +``` +*/ +@send external setUint32: (t, int, int, ~littleEndian: bool=?) => unit = "setUint32" + +/** +`setFloat16(dataView, offset, value, ~littleEndian=?)` writes a 16-bit floating point number (if supported) at the specified byte offset, with optional endianness. + +See [`DataView.setFloat16`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setFloat16) on MDN. + +## Examples + +```rescript +DataView.setFloat16(dv, 6, 1.5) +DataView.setFloat16(dv, 6, 1.5, ~littleEndian=true) +``` +*/ +@send external setFloat16: (t, int, float, ~littleEndian: bool=?) => unit = "setFloat16" + +/** +`setFloat32(dataView, offset, value, ~littleEndian=?)` writes a 32-bit floating point number at the specified byte offset, with optional endianness. + +See [`DataView.setFloat32`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setFloat32) on MDN. + +## Examples + +```rescript +DataView.setFloat32(dv, 8, 3.14) +DataView.setFloat32(dv, 8, 3.14, ~littleEndian=true) +``` +*/ +@send external setFloat32: (t, int, float, ~littleEndian: bool=?) => unit = "setFloat32" + +/** +`setFloat64(dataView, offset, value, ~littleEndian=?)` writes a 64-bit floating point number at the specified byte offset, with optional endianness. + +See [`DataView.setFloat64`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setFloat64) on MDN. + +## Examples + +```rescript +DataView.setFloat64(dv, 10, 6.28) +DataView.setFloat64(dv, 10, 6.28, ~littleEndian=true) +``` +*/ +@send external setFloat64: (t, int, float, ~littleEndian: bool=?) => unit = "setFloat64" + +/** +`setBigInt64(dataView, offset, value, ~littleEndian=?)` writes a 64-bit signed integer (BigInt) at the specified byte offset, with optional endianness. + +See [`DataView.setBigInt64`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setBigInt64) on MDN. + +## Examples + +```rescript +DataView.setBigInt64(dv, 12, -123456789n) +DataView.setBigInt64(dv, 12, -123456789n, ~littleEndian=true) +``` +*/ +@send external setBigInt64: (t, int, bigint, ~littleEndian: bool=?) => unit = "setBigInt64" + +/** +`setBigUint64(dataView, offset, value, ~littleEndian=?)` writes a 64-bit unsigned integer (BigInt) at the specified byte offset, with optional endianness. + +See [`DataView.setBigUint64`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setBigUint64) on MDN. + +## Examples + +```rescript +DataView.setBigUint64(dv, 14, 123456789n) +DataView.setBigUint64(dv, 14, 123456789n, ~littleEndian=true) +``` +*/ +@send external setBigUint64: (t, int, bigint, ~littleEndian: bool=?) => unit = "setBigUint64" + +/** +`ignore(dataView)` ignores the provided DataView and returns unit. + +This helper is useful when you want to discard a value (for example, the result of an operation with side effects) without having to store or process it further. +*/ +external ignore: t => unit = "%ignore" From b6fdfbb51595b5cd42822b0e84c19a4514398c34 Mon Sep 17 00:00:00 2001 From: htoooth Date: Mon, 15 Sep 2025 10:32:38 +0800 Subject: [PATCH 03/10] Update packages/@rescript/runtime/Stdlib_DataView.resi Co-authored-by: Christoph Knittel --- packages/@rescript/runtime/Stdlib_DataView.resi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/@rescript/runtime/Stdlib_DataView.resi b/packages/@rescript/runtime/Stdlib_DataView.resi index bef27ad196..a1a8fbc998 100644 --- a/packages/@rescript/runtime/Stdlib_DataView.resi +++ b/packages/@rescript/runtime/Stdlib_DataView.resi @@ -1,4 +1,4 @@ -/* Copyright (C) 2015-2016 Bloomberg Finance L.P. +/* Copyright (C) 2025- Authors of ReScript * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by From f0aa0af0ba9bbe30de454f31dcfb6e09a26b1ffa Mon Sep 17 00:00:00 2001 From: htoooth Date: Mon, 15 Sep 2025 14:58:33 +0000 Subject: [PATCH 04/10] add deprecated --- packages/@rescript/runtime/Stdlib_DataView.res | 6 ++---- packages/@rescript/runtime/Stdlib_DataView.resi | 16 ++++++++++------ 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/packages/@rescript/runtime/Stdlib_DataView.res b/packages/@rescript/runtime/Stdlib_DataView.res index 4ec93c81ff..7d564e1490 100644 --- a/packages/@rescript/runtime/Stdlib_DataView.res +++ b/packages/@rescript/runtime/Stdlib_DataView.res @@ -1,11 +1,9 @@ @notUndefined type t -@new external fromBuffer: Stdlib_ArrayBuffer.t => t = "DataView" +@new external fromBuffer: (Stdlib_ArrayBuffer.t, ~byteOffset: int=?, ~length: int=?) => t = "DataView" @new external fromBufferToEnd: (Stdlib_ArrayBuffer.t, ~byteOffset: int) => t = "DataView" -@new -external fromBufferWithRange: (Stdlib_ArrayBuffer.t, ~byteOffset: int, ~length: int) => t = - "DataView" +@new external fromBufferWithRange: (Stdlib_ArrayBuffer.t, ~byteOffset: int, ~length: int) => t = "DataView" @get external buffer: t => Stdlib_ArrayBuffer.t = "buffer" @get external byteLength: t => int = "byteLength" diff --git a/packages/@rescript/runtime/Stdlib_DataView.resi b/packages/@rescript/runtime/Stdlib_DataView.resi index a1a8fbc998..c7abad799c 100644 --- a/packages/@rescript/runtime/Stdlib_DataView.resi +++ b/packages/@rescript/runtime/Stdlib_DataView.resi @@ -45,12 +45,12 @@ See [`DataView`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Referen let dv = DataView.fromBuffer(buffer) ``` */ -@new external fromBuffer: Stdlib_ArrayBuffer.t => t = "DataView" +@new external fromBuffer: (Stdlib_ArrayBuffer.t, ~byteOffset: int=?, ~length: int=?) => t = "DataView" /** -`fromBufferToEnd(buffer, ~byteOffset)` creates a DataView starting at a given byte offset. +`fromBufferToEnd(buffer, ~byteOffset)` creates a DataView starting at a given byte offset. See [`DataView`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView) on MDN. -See [`DataView`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView) on MDN. +**Note:** This is a potentially unsafe operation. Ensure the buffer is large enough and only accessed within its bounds. ## Examples @@ -58,20 +58,24 @@ See [`DataView`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Referen let dv = DataView.fromBufferToEnd(buffer, ~byteOffset=4) ``` */ -@new external fromBufferToEnd: (Stdlib_ArrayBuffer.t, ~byteOffset: int) => t = "DataView" +@deprecated("Use `fromBuffer` instead") @new +external fromBufferToEnd: (Stdlib_ArrayBuffer.t, ~byteOffset: int) => t = "DataView" /** -`fromBufferWithRange(buffer, ~byteOffset, ~length)` creates a DataView for a specific byte range. +`fromBufferWithRange(buffer, ~byteOffset, ~length)` creates a DataView for a specific byte range. See [`DataView`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView) on MDN. +**Note:** This is a potentially unsafe operation. Ensure the buffer is large enough and only accessed within its bounds. + ## Examples ```rescript let dv = DataView.fromBufferWithRange(buffer, ~byteOffset=2, ~length=8) ``` */ -@new external fromBufferWithRange: (Stdlib_ArrayBuffer.t, ~byteOffset: int, ~length: int) => t = "DataView" +@deprecated("Use `fromBuffer` instead") @new +external fromBufferWithRange: (Stdlib_ArrayBuffer.t, ~byteOffset: int, ~length: int) => t = "DataView" /** `buffer(dataView)` returns the underlying ArrayBuffer referenced by this DataView. From 588e4f02484cc2542368328a4661383f45261b18 Mon Sep 17 00:00:00 2001 From: htoooth Date: Mon, 15 Sep 2025 15:17:36 +0000 Subject: [PATCH 05/10] update example and doc --- .../@rescript/runtime/Stdlib_DataView.resi | 54 ++++++++++--------- 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/packages/@rescript/runtime/Stdlib_DataView.resi b/packages/@rescript/runtime/Stdlib_DataView.resi index c7abad799c..e1761f0760 100644 --- a/packages/@rescript/runtime/Stdlib_DataView.resi +++ b/packages/@rescript/runtime/Stdlib_DataView.resi @@ -42,7 +42,9 @@ See [`DataView`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Referen ## Examples ```rescript -let dv = DataView.fromBuffer(buffer) +DataView.fromBuffer(ArrayBuffer.make(16)) +DataView.fromBuffer(ArrayBuffer.make(16), ~byteOffset=4) +DataView.fromBuffer(ArrayBuffer.make(16), ~byteOffset=4, ~length=8) ``` */ @new external fromBuffer: (Stdlib_ArrayBuffer.t, ~byteOffset: int=?, ~length: int=?) => t = "DataView" @@ -55,7 +57,7 @@ let dv = DataView.fromBuffer(buffer) ## Examples ```rescript -let dv = DataView.fromBufferToEnd(buffer, ~byteOffset=4) +DataView.fromBufferToEnd(buffer, ~byteOffset=4) ``` */ @deprecated("Use `fromBuffer` instead") @new @@ -71,7 +73,7 @@ See [`DataView`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Referen ## Examples ```rescript -let dv = DataView.fromBufferWithRange(buffer, ~byteOffset=2, ~length=8) +DataView.fromBufferWithRange(ArrayBuffer.make(16), ~byteOffset=2, ~length=8) ``` */ @deprecated("Use `fromBuffer` instead") @new @@ -85,7 +87,7 @@ See [`DataView.buffer`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/ ## Examples ```rescript -let arrBuf = DataView.buffer(dv) +DataView.buffer(dv) ``` */ @get external buffer: t => Stdlib_ArrayBuffer.t = "buffer" @@ -98,7 +100,7 @@ See [`DataView.byteLength`](https://developer.mozilla.org/en-US/docs/Web/JavaScr ## Examples ```rescript -let len = DataView.byteLength(dv) +DataView.byteLength(dv) ``` */ @get external byteLength: t => int = "byteLength" @@ -111,7 +113,7 @@ See [`DataView.byteOffset`](https://developer.mozilla.org/en-US/docs/Web/JavaScr ## Examples ```rescript -let offset = DataView.byteOffset(dv) +DataView.byteOffset(dv) ``` */ @get external byteOffset: t => int = "byteOffset" @@ -124,7 +126,7 @@ See [`DataView.getInt8`](https://developer.mozilla.org/en-US/docs/Web/JavaScript ## Examples ```rescript -let v = DataView.getInt8(dv, 0) +DataView.getInt8(dv, 0) ``` */ @send external getInt8: (t, int, ~littleEndian: bool=?) => int = "getInt8" @@ -137,7 +139,7 @@ See [`DataView.getUint8`](https://developer.mozilla.org/en-US/docs/Web/JavaScrip ## Examples ```rescript -let v = DataView.getUint8(dv, 1) +DataView.getUint8(dv, 1) ``` */ @send external getUint8: (t, int, ~littleEndian: bool=?) => int = "getUint8" @@ -150,8 +152,8 @@ See [`DataView.getInt16`](https://developer.mozilla.org/en-US/docs/Web/JavaScrip ## Examples ```rescript -let v1 = DataView.getInt16(dv, 2) -let v2 = DataView.getInt16(dv, 2, ~littleEndian=true) +DataView.getInt16(dv, 2) +DataView.getInt16(dv, 2, ~littleEndian=true) ``` */ @send external getInt16: (t, int, ~littleEndian: bool=?) => int = "getInt16" @@ -164,8 +166,8 @@ See [`DataView.getUint16`](https://developer.mozilla.org/en-US/docs/Web/JavaScri ## Examples ```rescript -let v1 = DataView.getUint16(dv, 2) -let v2 = DataView.getUint16(dv, 2, ~littleEndian=true) +DataView.getUint16(dv, 2) +DataView.getUint16(dv, 2, ~littleEndian=true) ``` */ @send external getUint16: (t, int, ~littleEndian: bool=?) => int = "getUint16" @@ -178,8 +180,8 @@ See [`DataView.getInt32`](https://developer.mozilla.org/en-US/docs/Web/JavaScrip ## Examples ```rescript -let v1 = DataView.getInt32(dv, 4) -let v2 = DataView.getInt32(dv, 4, ~littleEndian=true) +DataView.getInt32(dv, 4) +DataView.getInt32(dv, 4, ~littleEndian=true) ``` */ @send external getInt32: (t, int, ~littleEndian: bool=?) => int = "getInt32" @@ -192,8 +194,8 @@ See [`DataView.getUint32`](https://developer.mozilla.org/en-US/docs/Web/JavaScri ## Examples ```rescript -let v1 = DataView.getUint32(dv, 4) -let v2 = DataView.getUint32(dv, 4, ~littleEndian=true) +DataView.getUint32(dv, 4) +DataView.getUint32(dv, 4, ~littleEndian=true) ``` */ @send external getUint32: (t, int, ~littleEndian: bool=?) => int = "getUint32" @@ -205,8 +207,8 @@ See [`DataView.getFloat16`](https://developer.mozilla.org/en-US/docs/Web/JavaScr ## Examples ```rescript -let v1 = DataView.getFloat16(dv, 6) -let v2 = DataView.getFloat16(dv, 6, ~littleEndian=true) +DataView.getFloat16(dv, 6) +DataView.getFloat16(dv, 6, ~littleEndian=true) ``` */ @send external getFloat16: (t, int, ~littleEndian: bool=?) => float = "getFloat16" @@ -219,8 +221,8 @@ See [`DataView.getFloat32`](https://developer.mozilla.org/en-US/docs/Web/JavaScr ## Examples ```rescript -let v1 = DataView.getFloat32(dv, 8) -let v2 = DataView.getFloat32(dv, 8, ~littleEndian=true) +DataView.getFloat32(dv, 8) +DataView.getFloat32(dv, 8, ~littleEndian=true) ``` */ @send external getFloat32: (t, int, ~littleEndian: bool=?) => float = "getFloat32" @@ -233,8 +235,8 @@ See [`DataView.getFloat64`](https://developer.mozilla.org/en-US/docs/Web/JavaScr ## Examples ```rescript -let v1 = DataView.getFloat64(dv, 10) -let v2 = DataView.getFloat64(dv, 10, ~littleEndian=true) +DataView.getFloat64(dv, 10) +DataView.getFloat64(dv, 10, ~littleEndian=true) ``` */ @send external getFloat64: (t, int, ~littleEndian: bool=?) => float = "getFloat64" @@ -246,8 +248,8 @@ See [`DataView.getBigInt64`](https://developer.mozilla.org/en-US/docs/Web/JavaSc ## Examples ```rescript -let v1 = DataView.getBigInt64(dv, 12) -let v2 = DataView.getBigInt64(dv, 12, ~littleEndian=true) +DataView.getBigInt64(dv, 12) +DataView.getBigInt64(dv, 12, ~littleEndian=true) ``` */ @send external getBigInt64: (t, int, ~littleEndian: bool=?) => bigint = "getBigInt64" @@ -260,8 +262,8 @@ See [`DataView.getBigUint64`](https://developer.mozilla.org/en-US/docs/Web/JavaS ## Examples ```rescript -let v1 = DataView.getBigUint64(dv, 14) -let v2 = DataView.getBigUint64(dv, 14, ~littleEndian=true) +DataView.getBigUint64(dv, 14) +DataView.getBigUint64(dv, 14, ~littleEndian=true) ``` */ @send external getBigUint64: (t, int, ~littleEndian: bool=?) => bigint = "getBigUint64" From 872fe1e608ae89edda7e65fd3837e25865c21703 Mon Sep 17 00:00:00 2001 From: htoooth Date: Mon, 15 Sep 2025 15:22:14 +0000 Subject: [PATCH 06/10] fix resi error --- packages/@rescript/runtime/Stdlib_DataView.resi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/@rescript/runtime/Stdlib_DataView.resi b/packages/@rescript/runtime/Stdlib_DataView.resi index e1761f0760..640ddb64d4 100644 --- a/packages/@rescript/runtime/Stdlib_DataView.resi +++ b/packages/@rescript/runtime/Stdlib_DataView.resi @@ -129,7 +129,7 @@ See [`DataView.getInt8`](https://developer.mozilla.org/en-US/docs/Web/JavaScript DataView.getInt8(dv, 0) ``` */ -@send external getInt8: (t, int, ~littleEndian: bool=?) => int = "getInt8" +@send external getInt8: (t, int) => int = "getInt8" /** `getUint8(dataView, offset)` reads an 8-bit unsigned integer at the specified byte offset. @@ -142,7 +142,7 @@ See [`DataView.getUint8`](https://developer.mozilla.org/en-US/docs/Web/JavaScrip DataView.getUint8(dv, 1) ``` */ -@send external getUint8: (t, int, ~littleEndian: bool=?) => int = "getUint8" +@send external getUint8: (t, int) => int = "getUint8" /** `getInt16(dataView, offset, ~littleEndian=?)` reads a 16-bit signed integer at the specified byte offset, with optional endianness. From 640ea10b5df000f365dc148e9ac87ce476d72658 Mon Sep 17 00:00:00 2001 From: htoooth Date: Mon, 15 Sep 2025 15:42:11 +0000 Subject: [PATCH 07/10] add test --- .../@rescript/runtime/Stdlib_DataView.resi | 144 +++++++++++++----- 1 file changed, 106 insertions(+), 38 deletions(-) diff --git a/packages/@rescript/runtime/Stdlib_DataView.resi b/packages/@rescript/runtime/Stdlib_DataView.resi index 640ddb64d4..ee9c56e600 100644 --- a/packages/@rescript/runtime/Stdlib_DataView.resi +++ b/packages/@rescript/runtime/Stdlib_DataView.resi @@ -87,7 +87,9 @@ See [`DataView.buffer`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/ ## Examples ```rescript -DataView.buffer(dv) +let array_buffer = ArrayBuffer.make(16) +let dv = DataView.fromBuffer(array_buffer) +DataView.buffer(dv) == array_buffer ``` */ @get external buffer: t => Stdlib_ArrayBuffer.t = "buffer" @@ -100,7 +102,9 @@ See [`DataView.byteLength`](https://developer.mozilla.org/en-US/docs/Web/JavaScr ## Examples ```rescript -DataView.byteLength(dv) +let array_buffer = ArrayBuffer.make(16) +let dv = DataView.fromBuffer(array_buffer) +DataView.byteLength(dv) == 16 ``` */ @get external byteLength: t => int = "byteLength" @@ -113,7 +117,9 @@ See [`DataView.byteOffset`](https://developer.mozilla.org/en-US/docs/Web/JavaScr ## Examples ```rescript -DataView.byteOffset(dv) +let array_buffer = ArrayBuffer.make(16) +let dv = DataView.fromBuffer(array_buffer, ~byteOffset=4) +DataView.byteOffset(dv) == 4 ``` */ @get external byteOffset: t => int = "byteOffset" @@ -126,7 +132,9 @@ See [`DataView.getInt8`](https://developer.mozilla.org/en-US/docs/Web/JavaScript ## Examples ```rescript -DataView.getInt8(dv, 0) +let dv = DataView.fromBuffer(ArrayBuffer.make(16)) +dv->DateView.setInt8(0, -12) +DataView.getInt8(dv, 0) == -12 ``` */ @send external getInt8: (t, int) => int = "getInt8" @@ -139,7 +147,9 @@ See [`DataView.getUint8`](https://developer.mozilla.org/en-US/docs/Web/JavaScrip ## Examples ```rescript -DataView.getUint8(dv, 1) +let dv = DataView.fromBuffer(ArrayBuffer.make(16)) +dv->DateView.setUint8(1, 255) +DataView.getUint8(dv, 1) == 255 ``` */ @send external getUint8: (t, int) => int = "getUint8" @@ -152,8 +162,11 @@ See [`DataView.getInt16`](https://developer.mozilla.org/en-US/docs/Web/JavaScrip ## Examples ```rescript -DataView.getInt16(dv, 2) -DataView.getInt16(dv, 2, ~littleEndian=true) +let dv = DataView.fromBuffer(ArrayBuffer.make(16)) +dv->DateView.setInt16(0, -1234) +dv->DateView.setInt16(2, -1234, ~littleEndian=true) +DataView.getInt16(dv, 0) == -1234 +DataView.getInt16(dv, 2, ~littleEndian=true) == -1234 ``` */ @send external getInt16: (t, int, ~littleEndian: bool=?) => int = "getInt16" @@ -166,8 +179,11 @@ See [`DataView.getUint16`](https://developer.mozilla.org/en-US/docs/Web/JavaScri ## Examples ```rescript -DataView.getUint16(dv, 2) -DataView.getUint16(dv, 2, ~littleEndian=true) +let dv = DataView.fromBuffer(ArrayBuffer.make(16)) +dv->DateView.setUint16(0, 1234) +dv->DateView.setUint16(2, 1234, ~littleEndian=true) +DataView.getUint16(dv, 0) == 1234 +DataView.getUint16(dv, 2, ~littleEndian=true) == 1234 ``` */ @send external getUint16: (t, int, ~littleEndian: bool=?) => int = "getUint16" @@ -180,8 +196,11 @@ See [`DataView.getInt32`](https://developer.mozilla.org/en-US/docs/Web/JavaScrip ## Examples ```rescript -DataView.getInt32(dv, 4) -DataView.getInt32(dv, 4, ~littleEndian=true) +let dv = DataView.fromBuffer(ArrayBuffer.make(16)) +dv->DateView.setInt32(0, -123456) +dv->DateView.setInt32(4, -123456, ~littleEndian=true) +DataView.getInt32(dv, 0) == -123456 +DataView.getInt32(dv, 4, ~littleEndian=true) == -123456 ``` */ @send external getInt32: (t, int, ~littleEndian: bool=?) => int = "getInt32" @@ -194,8 +213,11 @@ See [`DataView.getUint32`](https://developer.mozilla.org/en-US/docs/Web/JavaScri ## Examples ```rescript -DataView.getUint32(dv, 4) -DataView.getUint32(dv, 4, ~littleEndian=true) +let dv = DataView.fromBuffer(ArrayBuffer.make(16)) +dv->DateView.setUint32(0, 123456) +dv->DateView.setUint32(4, 123456, ~littleEndian=true) +DataView.getUint32(dv, 0) == 123456 +DataView.getUint32(dv, 4, ~littleEndian=true) == 123456 ``` */ @send external getUint32: (t, int, ~littleEndian: bool=?) => int = "getUint32" @@ -207,8 +229,11 @@ See [`DataView.getFloat16`](https://developer.mozilla.org/en-US/docs/Web/JavaScr ## Examples ```rescript -DataView.getFloat16(dv, 6) -DataView.getFloat16(dv, 6, ~littleEndian=true) +let dv = DataView.fromBuffer(ArrayBuffer.make(16)) +dv->DateView.setFloat16(0, 1.5) +dv->DateView.setFloat16(2, 1.5, ~littleEndian=true) +DataView.getFloat16(dv, 0) == 1.5 +DataView.getFloat16(dv, 2, ~littleEndian=true) == 1.5 ``` */ @send external getFloat16: (t, int, ~littleEndian: bool=?) => float = "getFloat16" @@ -221,8 +246,11 @@ See [`DataView.getFloat32`](https://developer.mozilla.org/en-US/docs/Web/JavaScr ## Examples ```rescript -DataView.getFloat32(dv, 8) -DataView.getFloat32(dv, 8, ~littleEndian=true) +let dv = DataView.fromBuffer(ArrayBuffer.make(16)) +dv->DateView.setFloat32(0, 3.14) +dv->DateView.setFloat32(4, 3.14, ~littleEndian=true +DataView.getFloat32(dv, 0) == 3.14 +DataView.getFloat32(dv, 4, ~littleEndian=true) == 3.14 ``` */ @send external getFloat32: (t, int, ~littleEndian: bool=?) => float = "getFloat32" @@ -235,8 +263,11 @@ See [`DataView.getFloat64`](https://developer.mozilla.org/en-US/docs/Web/JavaScr ## Examples ```rescript -DataView.getFloat64(dv, 10) -DataView.getFloat64(dv, 10, ~littleEndian=true) +let dv = DataView.fromBuffer(ArrayBuffer.make(16)) +dv->DateView.setFloat64(0, 6.28) +dv->DateView.setFloat64(8, 6.28, ~littleEndian=true) +DataView.getFloat64(dv, 0) == 6.28 +DataView.getFloat64(dv, 8, ~littleEndian=true) == 6.28 ``` */ @send external getFloat64: (t, int, ~littleEndian: bool=?) => float = "getFloat64" @@ -248,8 +279,11 @@ See [`DataView.getBigInt64`](https://developer.mozilla.org/en-US/docs/Web/JavaSc ## Examples ```rescript -DataView.getBigInt64(dv, 12) -DataView.getBigInt64(dv, 12, ~littleEndian=true) +let dv = DataView.fromBuffer(ArrayBuffer.make(16)) +dv->DateView.setBigInt64(0, -123456789n) +dv->DateView.setBigInt64(8, -123456789n, ~littleEndian=true) +DataView.getBigInt64(dv, 0) == -123456789n +DataView.getBigInt64(dv, 8, ~littleEndian=true) == -123456789n ``` */ @send external getBigInt64: (t, int, ~littleEndian: bool=?) => bigint = "getBigInt64" @@ -262,8 +296,11 @@ See [`DataView.getBigUint64`](https://developer.mozilla.org/en-US/docs/Web/JavaS ## Examples ```rescript -DataView.getBigUint64(dv, 14) -DataView.getBigUint64(dv, 14, ~littleEndian=true) +let dv = DataView.fromBuffer(ArrayBuffer.make(16)) +dv->DateView.setBigUint64(0, 123456789n) +dv->DateView.setBigUint64(8, 123456789n, ~littleEndian=true) +DataView.getBigUint64(dv, 0) == 123456789n +DataView.getBigUint64(dv, 8, ~littleEndian=true) == 123456789n ``` */ @send external getBigUint64: (t, int, ~littleEndian: bool=?) => bigint = "getBigUint64" @@ -276,7 +313,9 @@ See [`DataView.setInt8`](https://developer.mozilla.org/en-US/docs/Web/JavaScript ## Examples ```rescript +let dv = DataView.fromBuffer(ArrayBuffer.make(16)) DataView.setInt8(dv, 0, -12) +dv->DateView.getInt8(0) == -12 ``` */ @send external setInt8: (t, int, int) => unit = "setInt8" @@ -289,7 +328,9 @@ See [`DataView.setUint8`](https://developer.mozilla.org/en-US/docs/Web/JavaScrip ## Examples ```rescript -DataView.setUint8(dv, 1, 255) +let dv = DataView.fromBuffer(ArrayBuffer.make(16)) +DataView.setUint8(dv, 0, 255) +dv->DateView.getUint8(0) == 255 ``` */ @send external setUint8: (t, int, int) => unit = "setUint8" @@ -302,8 +343,11 @@ See [`DataView.setInt16`](https://developer.mozilla.org/en-US/docs/Web/JavaScrip ## Examples ```rescript -DataView.setInt16(dv, 2, -1234) +let dv = DataView.fromBuffer(ArrayBuffer.make(16)) +DataView.setInt16(dv, 0 -1234) DataView.setInt16(dv, 2, -1234, ~littleEndian=true) +dv->DateView.getInt16(0) == -1234 +dv->DateView.getInt16(2, ~littleEndian=true) == -1234 ``` */ @send external setInt16: (t, int, int, ~littleEndian: bool=?) => unit = "setInt16" @@ -316,8 +360,11 @@ See [`DataView.setUint16`](https://developer.mozilla.org/en-US/docs/Web/JavaScri ## Examples ```rescript -DataView.setUint16(dv, 2, 1234) +let dv = DataView.fromBuffer(ArrayBuffer.make(16)) +DataView.setUint16(dv, 0, 1234) DataView.setUint16(dv, 2, 1234, ~littleEndian=true) +dv->DateView.getUint16(0) == 1234 +dv->DateView.getUint16(2, ~littleEndian=true) == 1234 ``` */ @send external setUint16: (t, int, int, ~littleEndian: bool=?) => unit = "setUint16" @@ -330,8 +377,11 @@ See [`DataView.setInt32`](https://developer.mozilla.org/en-US/docs/Web/JavaScrip ## Examples ```rescript -DataView.setInt32(dv, 4, -123456) +let dv = DataView.fromBuffer(ArrayBuffer.make(16)) +DataView.setInt32(dv, 0, -123456) DataView.setInt32(dv, 4, -123456, ~littleEndian=true) +dv->DateView.getInt32(0) == -123456 +dv->DateView.getInt32(4, ~littleEndian=true) == -123456 ``` */ @send external setInt32: (t, int, int, ~littleEndian: bool=?) => unit = "setInt32" @@ -344,8 +394,11 @@ See [`DataView.setUint32`](https://developer.mozilla.org/en-US/docs/Web/JavaScri ## Examples ```rescript -DataView.setUint32(dv, 4, 123456) +let dv = DataView.fromBuffer(ArrayBuffer.make(16)) +DataView.setUint32(dv, 0 123456) DataView.setUint32(dv, 4, 123456, ~littleEndian=true) +dv->DateView.getUint32(0) == 123456 +dv->DateView.getUint32(4, ~littleEndian=true) == 123456 ``` */ @send external setUint32: (t, int, int, ~littleEndian: bool=?) => unit = "setUint32" @@ -358,8 +411,11 @@ See [`DataView.setFloat16`](https://developer.mozilla.org/en-US/docs/Web/JavaScr ## Examples ```rescript -DataView.setFloat16(dv, 6, 1.5) -DataView.setFloat16(dv, 6, 1.5, ~littleEndian=true) +let dv = DataView.fromBuffer(ArrayBuffer.make(16)) +DataView.setFloat16(dv, 0, 1.5) +DataView.setFloat16(dv, 2, 1.5, ~littleEndian=true) +dv->DateView.getFloat16(0) == 1.5 +dv->DateView.getFloat16(2, ~littleEndian=true) == 1.5 ``` */ @send external setFloat16: (t, int, float, ~littleEndian: bool=?) => unit = "setFloat16" @@ -372,8 +428,11 @@ See [`DataView.setFloat32`](https://developer.mozilla.org/en-US/docs/Web/JavaScr ## Examples ```rescript -DataView.setFloat32(dv, 8, 3.14) -DataView.setFloat32(dv, 8, 3.14, ~littleEndian=true) +let dv = DataView.fromBuffer(ArrayBuffer.make(16)) +DataView.setFloat32(dv, 0, 3.14) +DataView.setFloat32(dv, 4, 3.14, ~littleEndian=true) +dv->DateView.getFloat32(0) == 3.14 +dv->DateView.getFloat32(4, ~littleEndian=true) == 3.14 ``` */ @send external setFloat32: (t, int, float, ~littleEndian: bool=?) => unit = "setFloat32" @@ -386,8 +445,11 @@ See [`DataView.setFloat64`](https://developer.mozilla.org/en-US/docs/Web/JavaScr ## Examples ```rescript -DataView.setFloat64(dv, 10, 6.28) -DataView.setFloat64(dv, 10, 6.28, ~littleEndian=true) +let dv = DataView.fromBuffer(ArrayBuffer.make(16)) +DataView.setFloat64(dv, 0, 6.28) +DataView.setFloat64(dv, 8, 6.28, ~littleEndian=true) +dv->DateView.getFloat64(0) == 6.28 +dv->DateView.getFloat64(8, ~littleEndian=true) == 6.28 ``` */ @send external setFloat64: (t, int, float, ~littleEndian: bool=?) => unit = "setFloat64" @@ -400,8 +462,11 @@ See [`DataView.setBigInt64`](https://developer.mozilla.org/en-US/docs/Web/JavaSc ## Examples ```rescript -DataView.setBigInt64(dv, 12, -123456789n) -DataView.setBigInt64(dv, 12, -123456789n, ~littleEndian=true) +let dv = DataView.fromBuffer(ArrayBuffer.make(16)) +DataView.setBigInt64(dv, 0, -123456789n) +DataView.setBigInt64(dv, 8, -123456789n, ~littleEndian=true) +dv->DateView.getBigInt64(0) == -123456789n +dv->DateView.getBigInt64(8, ~littleEndian=true) == -123456789n ``` */ @send external setBigInt64: (t, int, bigint, ~littleEndian: bool=?) => unit = "setBigInt64" @@ -414,8 +479,11 @@ See [`DataView.setBigUint64`](https://developer.mozilla.org/en-US/docs/Web/JavaS ## Examples ```rescript -DataView.setBigUint64(dv, 14, 123456789n) -DataView.setBigUint64(dv, 14, 123456789n, ~littleEndian=true) +let dv = DataView.fromBuffer(ArrayBuffer.make(16)) +DataView.setBigUint64(dv, 0, 123456789n) +DataView.setBigUint64(dv, 8, 123456789n, ~littleEndian=true) +dv->DateView.getBigUint64(0) == 123456789n +dv->DateView.getBigUint64(8, ~littleEndian=true) == 123456789n ``` */ @send external setBigUint64: (t, int, bigint, ~littleEndian: bool=?) => unit = "setBigUint64" From 67e3d02a65be0a7478d180736d37fbc95d16d393 Mon Sep 17 00:00:00 2001 From: Christoph Knittel Date: Mon, 15 Sep 2025 21:30:51 +0200 Subject: [PATCH 08/10] make format --- packages/@rescript/runtime/Stdlib_DataView.res | 7 +++++-- packages/@rescript/runtime/Stdlib_DataView.resi | 10 ++++++---- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/packages/@rescript/runtime/Stdlib_DataView.res b/packages/@rescript/runtime/Stdlib_DataView.res index 7d564e1490..2edf23d82c 100644 --- a/packages/@rescript/runtime/Stdlib_DataView.res +++ b/packages/@rescript/runtime/Stdlib_DataView.res @@ -1,9 +1,12 @@ @notUndefined type t -@new external fromBuffer: (Stdlib_ArrayBuffer.t, ~byteOffset: int=?, ~length: int=?) => t = "DataView" +@new +external fromBuffer: (Stdlib_ArrayBuffer.t, ~byteOffset: int=?, ~length: int=?) => t = "DataView" @new external fromBufferToEnd: (Stdlib_ArrayBuffer.t, ~byteOffset: int) => t = "DataView" -@new external fromBufferWithRange: (Stdlib_ArrayBuffer.t, ~byteOffset: int, ~length: int) => t = "DataView" +@new +external fromBufferWithRange: (Stdlib_ArrayBuffer.t, ~byteOffset: int, ~length: int) => t = + "DataView" @get external buffer: t => Stdlib_ArrayBuffer.t = "buffer" @get external byteLength: t => int = "byteLength" diff --git a/packages/@rescript/runtime/Stdlib_DataView.resi b/packages/@rescript/runtime/Stdlib_DataView.resi index ee9c56e600..966f02a596 100644 --- a/packages/@rescript/runtime/Stdlib_DataView.resi +++ b/packages/@rescript/runtime/Stdlib_DataView.resi @@ -47,7 +47,8 @@ DataView.fromBuffer(ArrayBuffer.make(16), ~byteOffset=4) DataView.fromBuffer(ArrayBuffer.make(16), ~byteOffset=4, ~length=8) ``` */ -@new external fromBuffer: (Stdlib_ArrayBuffer.t, ~byteOffset: int=?, ~length: int=?) => t = "DataView" +@new external fromBuffer: (Stdlib_ArrayBuffer.t, ~byteOffset: int=?, ~length: int=?) => t = + "DataView" /** `fromBufferToEnd(buffer, ~byteOffset)` creates a DataView starting at a given byte offset. See [`DataView`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView) on MDN. @@ -60,7 +61,7 @@ DataView.fromBuffer(ArrayBuffer.make(16), ~byteOffset=4, ~length=8) DataView.fromBufferToEnd(buffer, ~byteOffset=4) ``` */ -@deprecated("Use `fromBuffer` instead") @new +@deprecated("Use `fromBuffer` instead") @new external fromBufferToEnd: (Stdlib_ArrayBuffer.t, ~byteOffset: int) => t = "DataView" /** @@ -76,8 +77,9 @@ See [`DataView`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Referen DataView.fromBufferWithRange(ArrayBuffer.make(16), ~byteOffset=2, ~length=8) ``` */ -@deprecated("Use `fromBuffer` instead") @new -external fromBufferWithRange: (Stdlib_ArrayBuffer.t, ~byteOffset: int, ~length: int) => t = "DataView" +@deprecated("Use `fromBuffer` instead") @new +external fromBufferWithRange: (Stdlib_ArrayBuffer.t, ~byteOffset: int, ~length: int) => t = + "DataView" /** `buffer(dataView)` returns the underlying ArrayBuffer referenced by this DataView. From a4fdc4b9b22df85a71df8a0e922c7586aad9e210 Mon Sep 17 00:00:00 2001 From: htoooth Date: Mon, 15 Sep 2025 23:59:59 +0000 Subject: [PATCH 09/10] update artifacts.json --- packages/artifacts.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/artifacts.json b/packages/artifacts.json index b156f8d13d..d154ea922f 100644 --- a/packages/artifacts.json +++ b/packages/artifacts.json @@ -978,7 +978,9 @@ "lib/ocaml/Stdlib_DataView.cmi", "lib/ocaml/Stdlib_DataView.cmj", "lib/ocaml/Stdlib_DataView.cmt", + "lib/ocaml/Stdlib_DataView.cmti", "lib/ocaml/Stdlib_DataView.res", + "lib/ocaml/Stdlib_DataView.resi", "lib/ocaml/Stdlib_Date.cmi", "lib/ocaml/Stdlib_Date.cmj", "lib/ocaml/Stdlib_Date.cmt", From ea0573fa02daa6bc649b533e9524adbec75b8e65 Mon Sep 17 00:00:00 2001 From: htoooth Date: Tue, 16 Sep 2025 13:32:40 +0000 Subject: [PATCH 10/10] update ChangeLog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 40c450e7e2..cc3f989b28 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ #### :rocket: New Feature - Add `Array.filterMapWithIndex` to Stdlib. https://github.com/rescript-lang/rescript/pull/7876 +- Add `littleEndian` feature for `DataView` to Stdlib. https://github.com/rescript-lang/rescript/pull/7881 #### :bug: Bug fix