packages feed

haste-lib-0.6.0.0: src/Haste/Foreign/Array.hs

{-# LANGUAGE OverloadedStrings, ScopedTypeVariables, FlexibleContexts, FlexibleInstances #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Haste.Foreign.Array where
import Data.Array.IO hiding (index)
import Data.Array.Unboxed hiding (index)
import Data.Word
import Data.Int
import System.IO.Unsafe
import Haste.Prim
import Haste.Prim.Foreign

-- Additional instances
iouarrToAny :: JSString -> Opaque (IOUArray i e) -> IO JSAny
iouarrToAny = ffi "(function(v,a){return a.d['v'][v];})"

uarrToAny :: JSString -> Opaque (UArray i e) -> IO JSAny
uarrToAny = ffi "(function(v,a){return new a.d['v'][v].constructor(a.d['v'][v]);})"

anyToIOUArr :: JSAny -> IO (Opaque (IOUArray i e))
anyToIOUArr = ffi "(function(a){\
  \var arr = new ByteArray(a['buffer']);\
  \return new T4(0,0,a['length']-1,a['length'],arr);\
  \})"

anyToUArr :: JSAny -> IO (Opaque (UArray i e))
anyToUArr = ffi "(function(a){\
  \var arr = new ByteArray(new a.constructor(a['buffer']));\
  \return new T4(0,0,a['length']-1,a['length'],arr);\
  \})"

class (IArray UArray a, MArray IOUArray a IO) => ArrView a where
  arrView :: a -> JSString

instance ArrView Double where arrView _ = "f64"
instance ArrView Float  where arrView _ = "f32"
instance ArrView Int    where arrView _ = "i32"
instance ArrView Int8   where arrView _ = "i8"
instance ArrView Int16  where arrView _ = "i16"
instance ArrView Int32  where arrView _ = "i32"
instance ArrView Word   where arrView _ = "w32"
instance ArrView Word8  where arrView _ = "w8"
instance ArrView Word16 where arrView _ = "w16"
instance ArrView Word32 where arrView _ = "w32"

instance ArrView e => FromAny (IOUArray i e) where
  fromAny = fmap fromOpaque . anyToIOUArr

instance forall i e. ArrView e => ToAny (IOUArray i e) where
  toAny = unsafePerformIO . iouarrToAny (arrView (undefined :: e)) . toOpaque

instance (Ix i, ArrView e) => FromAny (UArray i e) where
  fromAny = fmap fromOpaque . anyToUArr

instance forall i e. (Ix i, ArrView e) => ToAny (UArray i e) where
  toAny = unsafePerformIO . uarrToAny (arrView (undefined :: e)) . toOpaque