{-# OPTIONS_GHC -fglasgow-exts -fallow-overlapping-instances #-} module PIL.Repr.Internals (prim, _0, _1, _2, _3) where import PIL.Native.Types import PIL.Native.Coerce import Data.Seq _0, _1, _2, _3 :: Seq a -> a _0 = (`index` 0) _1 = (`index` 1) _2 = (`index` 2) _3 = (`index` 3) prim :: IsPrim a b => x -> (a -> b) -> (x, a -> ObjectPrim) prim str fun = (str, mkPrim fun) class IsPrim a b where mkPrim :: (a -> b) -> a -> ObjectPrim instance IsPrim (TVar Native) (STM Native) where mkPrim f x _ = f x instance IsPrim (TVar Native) (Native -> STM ()) where mkPrim f x a = f x (index a 0) >> return nil instance IsNative a => IsPrim (TVar Native) (STM a) where mkPrim f x _ = fmap toNative (f x)