{-# OPTIONS_GHC -fno-warn-orphans #-}
{-# OPTIONS_GHC -Wno-redundant-constraints #-}
{-# LANGUAGE EmptyDataDecls #-}
{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE FlexibleContexts #-}

module GHCJS.Internal.Types where

import Data.Coerce

import Control.DeepSeq

import GHCJS.Prim (JSVal(..))

instance NFData JSVal where
  rnf x = x `seq` ()

class IsJSVal a where
  jsval_ :: a -> JSVal

  -- default jsval_ :: Coercible a JSVal => a -> JSVal
  default jsval_ :: Coercible a JSVal => a -> JSVal
  jsval_ _ = JSVal ()
  {-# INLINE jsval_ #-}

jsval :: IsJSVal a => a -> JSVal
jsval = jsval_
{-# INLINE jsval #-}

data MutabilityType s = Mutable_ s
                      | Immutable_ s
                      | STMutable s

type Mutable   = 'Mutable_ ()
type Immutable = 'Immutable_ ()

data IsItMutable = IsImmutable
                 | IsMutable

type family Mutability (a :: MutabilityType s) :: IsItMutable where
  Mutability Immutable     = 'IsImmutable
  Mutability Mutable       = 'IsMutable
  Mutability ('STMutable s) = 'IsMutable