如何在 GHCJS 上将未装箱的 Vector 转换为 JS TypedArray?
How do you convert from an Unboxed Vector to a JS TypedArray on GHCJS?
我有一个 Data.Vector.Unboxed.Vector Word32
类型的元素。我想将其转换为原生 JS TypedArray
(特别是 Uint32Array
)。我知道 toJsArray
和 toJsValListOf
,但这两个函数都处理列表,而不是向量,而且效率低下。如何将未装箱的 Vector
直接转换为 JS TypedArray
?
我能够解决这个问题,直到编组为 Int32Array
而不是 Uint32Array
;可能真正了解 GHCJS 超过一个小时的人将能够对此进行扩展,以便您获得 Uint32Array
(或者您可以制作 GHCJS.Buffer
支持 getUint32Array
操作)。
想法是获取 Vector
表示的 ByteArray
,然后 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 ".slice(, )" js_slice :: Int -> Int -> Int32Array -> Int32Array
-- should be
-- foreign import javascript unsafe ".slice(, )" 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();" js_debug :: JSVal -> IO ()
main = do
let v' = toI32Array v
js_debug $ jsval v'
如果您在浏览器中查看控制台,您可以检查 jsval v'
确实具有类型 Int32Array
。
我有一个 Data.Vector.Unboxed.Vector Word32
类型的元素。我想将其转换为原生 JS TypedArray
(特别是 Uint32Array
)。我知道 toJsArray
和 toJsValListOf
,但这两个函数都处理列表,而不是向量,而且效率低下。如何将未装箱的 Vector
直接转换为 JS TypedArray
?
我能够解决这个问题,直到编组为 Int32Array
而不是 Uint32Array
;可能真正了解 GHCJS 超过一个小时的人将能够对此进行扩展,以便您获得 Uint32Array
(或者您可以制作 GHCJS.Buffer
支持 getUint32Array
操作)。
想法是获取 Vector
表示的 ByteArray
,然后 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 ".slice(, )" js_slice :: Int -> Int -> Int32Array -> Int32Array
-- should be
-- foreign import javascript unsafe ".slice(, )" 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();" js_debug :: JSVal -> IO ()
main = do
let v' = toI32Array v
js_debug $ jsval v'
如果您在浏览器中查看控制台,您可以检查 jsval v'
确实具有类型 Int32Array
。