如何从GHCJS上的Unboxed Vector转换为JS TypedArray?

时间:2015-12-22 00:27:24

标签: javascript haskell ghcjs

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

1 个答案:

答案 0 :(得分:1)

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

我们的想法是让getUint32Array代表ByteArray表示,然后Vector,以便只保留相关部分:

slice

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

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'类型。