javascript – 如何在GHCJS上从Unboxed Vector转换为JS TypedArray?

我有一个Data.Vector.UnBoxed.Vector Word32类型的元素.我想将其转换为本机JS TypedArray(特别是Uint32Array).我知道toJsArray和toJsVallistof,但两个函数都处理列表,而不是向量,并且效率低下.如何将未装箱的Vector直接转换为JS TypedArray?

解决方法

我能够解决这个问题,然后编组到Int32Array而不是Uint32Array;可能有人已经知道GHCJS的时间超过了我已经投入的一个小时就可以扩展这个以便你得到你的Uint32Array(或者你可以制作一个hack-up版本的GHCJS.Buffer支持一个getUint32Array操作).

我们的想法是让ByteArray成为Vector表示的基础,然后将其切片以便只保留相关部分:

import Data.Vector.UnBoxed as V
import Data.Word

import qualified Data.Vector.UnBoxed.Base as B
import qualified Data.Vector.Primitive as P
import GHCJS.Types
import qualified GHCJS.Buffer as Buffer
import JavaScript.TypedArray (Int32Array)

-- Todo: generalize this to all types that support unBoxed vectors...
toI32Array :: Vector Word32 -> Int32Array
toI32Array (B.V_Word32 (P.Vector offset len bs)) =
    js_slice offset (offset + len) $Buffer.getInt32Array (Buffer.fromByteArray bs)


foreign import javascript unsafe "$3.slice($1,$2)" js_slice :: Int -> Int -> Int32Array -> Int32Array
-- should be
-- foreign import javascript unsafe "$3.slice($1,$2)" js_slice :: Int -> Int -> SomeTypedArray a m -> SomeTypedArray a m
-- but alas,JavaScript.TypedArray.Internal.Type is a hidden module

以下是使用它的一些示例代码

v :: Vector Word32
v = V.fromList [1,2,3]

foreign import javascript unsafe "console.debug($1);" js_debug :: JSVal -> IO ()

main = do
    let v' = toI32Array v
    js_debug $jsval v'

如果你在浏览器中查看控制台,你可以检查jsval v’确实有Int32Array类型.

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...