{-# LANGUAGE CPP #-}
{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TupleSections #-}
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE JavaScriptFFI #-}
{-# LANGUAGE ForeignFunctionInterface #-}
{-# LANGUAGE UnliftedFFITypes #-}
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveDataTypeable #-}
module GHCJS.Marshal.Pure ( PFromJSVal(..)
, PToJSVal(..)
) where
import Data.Char (chr, ord)
import Data.Data
import Data.Int (Int8, Int16, Int32)
import Data.JSString.Internal.Type
import Data.Maybe
import Data.Text (Text)
import Data.Typeable
import Data.Word (Word8, Word16, Word32, Word)
import Data.JSString
import Data.JSString.Text
import Data.Bits ((.&.))
import Unsafe.Coerce (unsafeCoerce)
import GHC.Int
import GHC.Word
import GHC.Types
import GHC.Float
import GHC.Prim
import GHCJS.Types
import qualified GHCJS.Prim as Prim
import GHCJS.Foreign.Internal
import GHCJS.Marshal.Internal
instance PFromJSVal JSVal where pFromJSVal = id
{-# INLINE pFromJSVal #-}
instance PFromJSVal () where pFromJSVal _ = ()
{-# INLINE pFromJSVal #-}
instance PFromJSVal JSString where pFromJSVal = JSString
{-# INLINE pFromJSVal #-}
instance PFromJSVal [Char] where pFromJSVal = Prim.fromJSString
{-# INLINE pFromJSVal #-}
instance PFromJSVal Text where pFromJSVal = textFromJSVal
{-# INLINE pFromJSVal #-}
instance PFromJSVal Char where pFromJSVal x = C# (jsvalToChar x)
{-# INLINE pFromJSVal #-}
instance PFromJSVal Bool where pFromJSVal = isTruthy
{-# INLINE pFromJSVal #-}
instance PFromJSVal Int where pFromJSVal x = I# (jsvalToInt x)
{-# INLINE pFromJSVal #-}
instance PFromJSVal Int8 where pFromJSVal x = I8# (jsvalToInt8 x)
{-# INLINE pFromJSVal #-}
instance PFromJSVal Int16 where pFromJSVal x = I16# (jsvalToInt16 x)
{-# INLINE pFromJSVal #-}
instance PFromJSVal Int32 where pFromJSVal x = I32# (jsvalToInt x)
{-# INLINE pFromJSVal #-}
instance PFromJSVal Word where pFromJSVal x = W# (jsvalToWord x)
{-# INLINE pFromJSVal #-}
instance PFromJSVal Word8 where pFromJSVal x = W8# (jsvalToWord8 x)
{-# INLINE pFromJSVal #-}
instance PFromJSVal Word16 where pFromJSVal x = W16# (jsvalToWord16 x)
{-# INLINE pFromJSVal #-}
instance PFromJSVal Word32 where pFromJSVal x = W32# (jsvalToWord x)
{-# INLINE pFromJSVal #-}
instance PFromJSVal Float where pFromJSVal x = F# (jsvalToFloat x)
{-# INLINE pFromJSVal #-}
instance PFromJSVal Double where pFromJSVal x = D# (jsvalToDouble x)
{-# INLINE pFromJSVal #-}
instance PFromJSVal a => PFromJSVal (Maybe a) where
pFromJSVal x | isUndefined x || isNull x = Nothing
pFromJSVal x = Just (pFromJSVal x)
{-# INLINE pFromJSVal #-}
instance PToJSVal JSVal where pToJSVal = id
{-# INLINE pToJSVal #-}
instance PToJSVal JSString where pToJSVal = jsval
{-# INLINE pToJSVal #-}
instance PToJSVal [Char] where pToJSVal = Prim.toJSString
{-# INLINE pToJSVal #-}
instance PToJSVal Text where pToJSVal = jsval . textToJSString
{-# INLINE pToJSVal #-}
instance PToJSVal Char where pToJSVal (C# c) = charToJSVal c
{-# INLINE pToJSVal #-}
instance PToJSVal Bool where pToJSVal True = jsTrue
pToJSVal False = jsFalse
{-# INLINE pToJSVal #-}
instance PToJSVal Int where pToJSVal (I# x) = intToJSVal x
{-# INLINE pToJSVal #-}
instance PToJSVal Int8 where pToJSVal (I8# x) = intToJSVal x
{-# INLINE pToJSVal #-}
instance PToJSVal Int16 where pToJSVal (I16# x) = intToJSVal x
{-# INLINE pToJSVal #-}
instance PToJSVal Int32 where pToJSVal (I32# x) = intToJSVal x
{-# INLINE pToJSVal #-}
instance PToJSVal Word where pToJSVal (W# x) = wordToJSVal x
{-# INLINE pToJSVal #-}
instance PToJSVal Word8 where pToJSVal (W8# x) = wordToJSVal x
{-# INLINE pToJSVal #-}
instance PToJSVal Word16 where pToJSVal (W16# x) = wordToJSVal x
{-# INLINE pToJSVal #-}
instance PToJSVal Word32 where pToJSVal (W32# x) = wordToJSVal x
{-# INLINE pToJSVal #-}
instance PToJSVal Float where pToJSVal (F# x) = floatToJSVal x
{-# INLINE pToJSVal #-}
instance PToJSVal Double where pToJSVal (D# x) = doubleToJSVal x
{-# INLINE pToJSVal #-}
instance PToJSVal a => PToJSVal (Maybe a) where
pToJSVal Nothing = jsNull
pToJSVal (Just a) = pToJSVal a
{-# INLINE pToJSVal #-}
foreign import javascript unsafe "$r = $1|0;" jsvalToWord :: JSVal -> Word#
foreign import javascript unsafe "$r = $1&0xff;" jsvalToWord8 :: JSVal -> Word#
foreign import javascript unsafe "$r = $1&0xffff;" jsvalToWord16 :: JSVal -> Word#
foreign import javascript unsafe "$r = $1|0;" jsvalToInt :: JSVal -> Int#
foreign import javascript unsafe "$r = $1<<24>>24;" jsvalToInt8 :: JSVal -> Int#
foreign import javascript unsafe "$r = $1<<16>>16;" jsvalToInt16 :: JSVal -> Int#
foreign import javascript unsafe "$r = +$1;" jsvalToFloat :: JSVal -> Float#
foreign import javascript unsafe "$r = +$1;" jsvalToDouble :: JSVal -> Double#
foreign import javascript unsafe "$r = $1&0x7fffffff;" jsvalToChar :: JSVal -> Char#
foreign import javascript unsafe "$r = $1;" wordToJSVal :: Word# -> JSVal
foreign import javascript unsafe "$r = $1;" intToJSVal :: Int# -> JSVal
foreign import javascript unsafe "$r = $1;" doubleToJSVal :: Double# -> JSVal
foreign import javascript unsafe "$r = $1;" floatToJSVal :: Float# -> JSVal
foreign import javascript unsafe "$r = $1;" charToJSVal :: Char# -> JSVal