{-# language MagicHash #-}
{-# language UnboxedTuples #-}
{-# language TypeFamilies #-}
{-# language ScopedTypeVariables #-}

module Data.Primitive.Unlifted.Class
  ( PrimUnlifted(..)
  ) where

import Data.ByteString.Short.Internal (ShortByteString(SBS))
import Data.Text.Short (ShortText,toShortByteString)
import Data.Text.Short.Unsafe (fromShortByteStringUnsafe)
import Data.Primitive.PrimArray (PrimArray(..),MutablePrimArray(..))
import Data.Primitive.ByteArray (ByteArray(..),MutableByteArray(..))
import Data.Primitive.Array (Array (..), MutableArray (..))
import Data.Primitive.SmallArray (SmallArray (..), SmallMutableArray (..))
import Data.Primitive.MutVar (MutVar (..))
import GHC.MVar (MVar(..))
import GHC.IORef (IORef(..))
import GHC.STRef (STRef(..))
import GHC.Weak (Weak(..))
import GHC.Conc (TVar(..),ThreadId(..))
import GHC.StableName (StableName(..))
import GHC.Exts (MutableByteArray#,ByteArray#
                ,Array#,MutableArray#,SmallArray#,SmallMutableArray#
                ,Weak#,TVar#,ThreadId#,StableName#)
import GHC.Exts (RuntimeRep(UnliftedRep))
import GHC.Exts (MVar#,MutVar#,RealWorld)
import GHC.Exts (TYPE)

import qualified Data.Primitive.MVar as PM
import qualified GHC.Exts as Exts

class PrimUnlifted a where
  type Unlifted a :: TYPE 'UnliftedRep
  toUnlifted# :: a -> Unlifted a
  fromUnlifted# :: Unlifted a -> a

instance PrimUnlifted (Array a) where
  type Unlifted (Array a) = Array# a
  toUnlifted# :: Array a -> Unlifted (Array a)
toUnlifted# (Array Array# a
a) = Array# a
Unlifted (Array a)
a
  fromUnlifted# :: Unlifted (Array a) -> Array a
fromUnlifted# Unlifted (Array a)
x = Array# a -> Array a
forall a. Array# a -> Array a
Array Array# a
Unlifted (Array a)
x

instance PrimUnlifted (MutableArray s a) where
  type Unlifted (MutableArray s a) = MutableArray# s a
  toUnlifted# :: MutableArray s a -> Unlifted (MutableArray s a)
toUnlifted# (MutableArray MutableArray# s a
a) = MutableArray# s a
Unlifted (MutableArray s a)
a
  fromUnlifted# :: Unlifted (MutableArray s a) -> MutableArray s a
fromUnlifted# Unlifted (MutableArray s a)
x = MutableArray# s a -> MutableArray s a
forall s a. MutableArray# s a -> MutableArray s a
MutableArray MutableArray# s a
Unlifted (MutableArray s a)
x

instance PrimUnlifted (SmallArray a) where
  type Unlifted (SmallArray a) = SmallArray# a
  toUnlifted# :: SmallArray a -> Unlifted (SmallArray a)
toUnlifted# (SmallArray SmallArray# a
a) = SmallArray# a
Unlifted (SmallArray a)
a
  fromUnlifted# :: Unlifted (SmallArray a) -> SmallArray a
fromUnlifted# Unlifted (SmallArray a)
x = SmallArray# a -> SmallArray a
forall a. SmallArray# a -> SmallArray a
SmallArray SmallArray# a
Unlifted (SmallArray a)
x

instance PrimUnlifted (SmallMutableArray s a) where
  type Unlifted (SmallMutableArray s a) = SmallMutableArray# s a
  toUnlifted# :: SmallMutableArray s a -> Unlifted (SmallMutableArray s a)
toUnlifted# (SmallMutableArray SmallMutableArray# s a
a) = SmallMutableArray# s a
Unlifted (SmallMutableArray s a)
a
  fromUnlifted# :: Unlifted (SmallMutableArray s a) -> SmallMutableArray s a
fromUnlifted# Unlifted (SmallMutableArray s a)
x = SmallMutableArray# s a -> SmallMutableArray s a
forall s a. SmallMutableArray# s a -> SmallMutableArray s a
SmallMutableArray SmallMutableArray# s a
Unlifted (SmallMutableArray s a)
x

instance PrimUnlifted (PrimArray a) where
  type Unlifted (PrimArray a) = ByteArray#
  toUnlifted# :: PrimArray a -> Unlifted (PrimArray a)
toUnlifted# (PrimArray ByteArray#
x) = ByteArray#
Unlifted (PrimArray a)
x
  fromUnlifted# :: Unlifted (PrimArray a) -> PrimArray a
fromUnlifted# Unlifted (PrimArray a)
x = ByteArray# -> PrimArray a
forall a. ByteArray# -> PrimArray a
PrimArray ByteArray#
Unlifted (PrimArray a)
x

instance PrimUnlifted ByteArray where
  type Unlifted ByteArray = ByteArray#
  toUnlifted# :: ByteArray -> Unlifted ByteArray
toUnlifted# (ByteArray ByteArray#
x) = ByteArray#
Unlifted ByteArray
x
  fromUnlifted# :: Unlifted ByteArray -> ByteArray
fromUnlifted# Unlifted ByteArray
x = ByteArray# -> ByteArray
ByteArray ByteArray#
Unlifted ByteArray
x

instance PrimUnlifted ShortByteString where
  type Unlifted ShortByteString = ByteArray#
  toUnlifted# :: ShortByteString -> Unlifted ShortByteString
toUnlifted# (SBS ByteArray#
x) = ByteArray#
Unlifted ShortByteString
x
  fromUnlifted# :: Unlifted ShortByteString -> ShortByteString
fromUnlifted# Unlifted ShortByteString
x = ByteArray# -> ShortByteString
SBS ByteArray#
Unlifted ShortByteString
x

instance PrimUnlifted ShortText where
  type Unlifted ShortText = ByteArray#
  toUnlifted# :: ShortText -> Unlifted ShortText
toUnlifted# ShortText
t = case ShortText -> ShortByteString
toShortByteString ShortText
t of { SBS ByteArray#
x -> ByteArray#
Unlifted ShortText
x }
  fromUnlifted# :: Unlifted ShortText -> ShortText
fromUnlifted# Unlifted ShortText
x = ShortByteString -> ShortText
fromShortByteStringUnsafe (ByteArray# -> ShortByteString
SBS ByteArray#
Unlifted ShortText
x)

instance PrimUnlifted (MutableByteArray s) where
  type Unlifted (MutableByteArray s) = MutableByteArray# s
  toUnlifted# :: MutableByteArray s -> Unlifted (MutableByteArray s)
toUnlifted# (MutableByteArray MutableByteArray# s
x) = MutableByteArray# s
Unlifted (MutableByteArray s)
x
  fromUnlifted# :: Unlifted (MutableByteArray s) -> MutableByteArray s
fromUnlifted# Unlifted (MutableByteArray s)
x = MutableByteArray# s -> MutableByteArray s
forall s. MutableByteArray# s -> MutableByteArray s
MutableByteArray MutableByteArray# s
Unlifted (MutableByteArray s)
x

instance PrimUnlifted (MutablePrimArray s a) where
  type Unlifted (MutablePrimArray s a) = MutableByteArray# s
  toUnlifted# :: MutablePrimArray s a -> Unlifted (MutablePrimArray s a)
toUnlifted# (MutablePrimArray MutableByteArray# s
x) = MutableByteArray# s
Unlifted (MutablePrimArray s a)
x
  fromUnlifted# :: Unlifted (MutablePrimArray s a) -> MutablePrimArray s a
fromUnlifted# Unlifted (MutablePrimArray s a)
x = MutableByteArray# s -> MutablePrimArray s a
forall s a. MutableByteArray# s -> MutablePrimArray s a
MutablePrimArray MutableByteArray# s
Unlifted (MutablePrimArray s a)
x

instance PrimUnlifted (PM.MVar s a) where
  type Unlifted (PM.MVar s a) = MVar# s a
  toUnlifted# :: MVar s a -> Unlifted (MVar s a)
toUnlifted# (PM.MVar MVar# s a
x) = MVar# s a
Unlifted (MVar s a)
x
  fromUnlifted# :: Unlifted (MVar s a) -> MVar s a
fromUnlifted# Unlifted (MVar s a)
x = MVar# s a -> MVar s a
forall s a. MVar# s a -> MVar s a
PM.MVar MVar# s a
Unlifted (MVar s a)
x

instance PrimUnlifted (MVar a) where
  type Unlifted (MVar a) = MVar# RealWorld a
  toUnlifted# :: MVar a -> Unlifted (MVar a)
toUnlifted# (MVar MVar# RealWorld a
x) = MVar# RealWorld a
Unlifted (MVar a)
x
  fromUnlifted# :: Unlifted (MVar a) -> MVar a
fromUnlifted# Unlifted (MVar a)
x = MVar# RealWorld a -> MVar a
forall a. MVar# RealWorld a -> MVar a
MVar MVar# RealWorld a
Unlifted (MVar a)
x

instance PrimUnlifted (MutVar s a) where
  type Unlifted (MutVar s a) = MutVar# s a
  toUnlifted# :: MutVar s a -> Unlifted (MutVar s a)
toUnlifted# (MutVar MutVar# s a
x) = MutVar# s a
Unlifted (MutVar s a)
x
  fromUnlifted# :: Unlifted (MutVar s a) -> MutVar s a
fromUnlifted# Unlifted (MutVar s a)
x = MutVar# s a -> MutVar s a
forall s a. MutVar# s a -> MutVar s a
MutVar MutVar# s a
Unlifted (MutVar s a)
x

instance PrimUnlifted (STRef s a) where
  type Unlifted (STRef s a) = MutVar# s a
  toUnlifted# :: STRef s a -> Unlifted (STRef s a)
toUnlifted# (STRef MutVar# s a
x) = MutVar# s a
Unlifted (STRef s a)
x
  fromUnlifted# :: Unlifted (STRef s a) -> STRef s a
fromUnlifted# Unlifted (STRef s a)
x = MutVar# s a -> STRef s a
forall s a. MutVar# s a -> STRef s a
STRef MutVar# s a
Unlifted (STRef s a)
x

instance PrimUnlifted (IORef a) where
  type Unlifted (IORef a) = MutVar# RealWorld a
  toUnlifted# :: IORef a -> Unlifted (IORef a)
toUnlifted# (IORef (STRef MutVar# RealWorld a
x)) = MutVar# RealWorld a
Unlifted (IORef a)
x
  fromUnlifted# :: Unlifted (IORef a) -> IORef a
fromUnlifted# Unlifted (IORef a)
x = STRef RealWorld a -> IORef a
forall a. STRef RealWorld a -> IORef a
IORef (MutVar# RealWorld a -> STRef RealWorld a
forall s a. MutVar# s a -> STRef s a
STRef MutVar# RealWorld a
Unlifted (IORef a)
x)

instance PrimUnlifted (Weak a) where
  type Unlifted (Weak a) = Weak# a
  toUnlifted# :: Weak a -> Unlifted (Weak a)
toUnlifted# (Weak Weak# a
w) = Weak# a
Unlifted (Weak a)
w
  fromUnlifted# :: Unlifted (Weak a) -> Weak a
fromUnlifted# Unlifted (Weak a)
w = Weak# a -> Weak a
forall v. Weak# v -> Weak v
Weak Weak# a
Unlifted (Weak a)
w

instance PrimUnlifted (TVar a) where
  type Unlifted (TVar a) = TVar# Exts.RealWorld a
  toUnlifted# :: TVar a -> Unlifted (TVar a)
toUnlifted# (TVar TVar# RealWorld a
t) = TVar# RealWorld a
Unlifted (TVar a)
t
  fromUnlifted# :: Unlifted (TVar a) -> TVar a
fromUnlifted# Unlifted (TVar a)
t = TVar# RealWorld a -> TVar a
forall a. TVar# RealWorld a -> TVar a
TVar TVar# RealWorld a
Unlifted (TVar a)
t

instance PrimUnlifted ThreadId where
  type Unlifted ThreadId = ThreadId#
  toUnlifted# :: ThreadId -> Unlifted ThreadId
toUnlifted# (ThreadId ThreadId#
tid) = ThreadId#
Unlifted ThreadId
tid
  fromUnlifted# :: Unlifted ThreadId -> ThreadId
fromUnlifted# Unlifted ThreadId
tid = ThreadId# -> ThreadId
ThreadId ThreadId#
Unlifted ThreadId
tid

instance PrimUnlifted (StableName a) where
  type Unlifted (StableName a) = StableName# a
  toUnlifted# :: StableName a -> Unlifted (StableName a)
toUnlifted# (StableName StableName# a
sn) = StableName# a
Unlifted (StableName a)
sn
  fromUnlifted# :: Unlifted (StableName a) -> StableName a
fromUnlifted# Unlifted (StableName a)
sn = StableName# a -> StableName a
forall a. StableName# a -> StableName a
StableName StableName# a
Unlifted (StableName a)
sn