{-# LINE 1 "lib/CPython/Types/Slice.chs" #-}
{-# LANGUAGE ForeignFunctionInterface #-}
module CPython.Types.Slice
( Slice
, sliceType
, new
, getIndices
) where
import qualified Foreign.C.Types as C2HSImp
import qualified Foreign.Ptr as C2HSImp
import qualified System.IO.Unsafe as C2HSImp
import Prelude hiding (length)
import CPython.Internal hiding (new)
newtype Slice = Slice (ForeignPtr Slice)
instance Object Slice where
toObject :: Slice -> SomeObject
toObject (Slice ForeignPtr Slice
x) = ForeignPtr Slice -> SomeObject
forall a. Object a => ForeignPtr a -> SomeObject
SomeObject ForeignPtr Slice
x
fromForeignPtr :: ForeignPtr Slice -> Slice
fromForeignPtr = ForeignPtr Slice -> Slice
Slice
instance Concrete Slice where
concreteType :: Slice -> Type
concreteType Slice
_ = Type
sliceType
sliceType :: (Type)
sliceType :: Type
sliceType =
IO Type -> Type
forall a. IO a -> a
C2HSImp.unsafePerformIO (IO Type -> Type) -> IO Type -> Type
forall a b. (a -> b) -> a -> b
$
IO (Ptr ())
sliceType'_ IO (Ptr ()) -> (Ptr () -> IO Type) -> IO Type
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Ptr ()
res ->
Ptr () -> IO Type
forall obj a. Object obj => Ptr a -> IO obj
peekStaticObject Ptr ()
res IO Type -> (Type -> IO Type) -> IO Type
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Type
res' ->
Type -> IO Type
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (Type
res')
{-# LINE 41 "lib/CPython/Types/Slice.chs" #-}
new :: (Object start, Object stop, Object step) => Maybe start -> Maybe stop -> Maybe step -> IO Slice
new start stop step =
maybeWith withObject start $ \startPtr ->
maybeWith withObject stop $ \stopPtr ->
maybeWith withObject step $ \stepPtr ->
pySliceNew startPtr stopPtr stepPtr
>>= stealObject
getIndices :: Slice
-> Integer
-> IO (Integer, Integer, Integer, Integer)
getIndices :: Slice -> Integer -> IO (Integer, Integer, Integer, Integer)
getIndices Slice
slice Integer
length =
Slice
-> (Ptr () -> IO (Integer, Integer, Integer, Integer))
-> IO (Integer, Integer, Integer, Integer)
forall obj a b. Object obj => obj -> (Ptr a -> IO b) -> IO b
withObject Slice
slice ((Ptr () -> IO (Integer, Integer, Integer, Integer))
-> IO (Integer, Integer, Integer, Integer))
-> (Ptr () -> IO (Integer, Integer, Integer, Integer))
-> IO (Integer, Integer, Integer, Integer)
forall a b. (a -> b) -> a -> b
$ \Ptr ()
slicePtr ->
let length' :: CLong
length' = Integer -> CLong
forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
length in
(Ptr CLong -> IO (Integer, Integer, Integer, Integer))
-> IO (Integer, Integer, Integer, Integer)
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr CLong -> IO (Integer, Integer, Integer, Integer))
-> IO (Integer, Integer, Integer, Integer))
-> (Ptr CLong -> IO (Integer, Integer, Integer, Integer))
-> IO (Integer, Integer, Integer, Integer)
forall a b. (a -> b) -> a -> b
$ \Ptr CLong
startPtr ->
(Ptr CLong -> IO (Integer, Integer, Integer, Integer))
-> IO (Integer, Integer, Integer, Integer)
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr CLong -> IO (Integer, Integer, Integer, Integer))
-> IO (Integer, Integer, Integer, Integer))
-> (Ptr CLong -> IO (Integer, Integer, Integer, Integer))
-> IO (Integer, Integer, Integer, Integer)
forall a b. (a -> b) -> a -> b
$ \Ptr CLong
stopPtr ->
(Ptr CLong -> IO (Integer, Integer, Integer, Integer))
-> IO (Integer, Integer, Integer, Integer)
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr CLong -> IO (Integer, Integer, Integer, Integer))
-> IO (Integer, Integer, Integer, Integer))
-> (Ptr CLong -> IO (Integer, Integer, Integer, Integer))
-> IO (Integer, Integer, Integer, Integer)
forall a b. (a -> b) -> a -> b
$ \Ptr CLong
stepPtr ->
(Ptr CLong -> IO (Integer, Integer, Integer, Integer))
-> IO (Integer, Integer, Integer, Integer)
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr CLong -> IO (Integer, Integer, Integer, Integer))
-> IO (Integer, Integer, Integer, Integer))
-> (Ptr CLong -> IO (Integer, Integer, Integer, Integer))
-> IO (Integer, Integer, Integer, Integer)
forall a b. (a -> b) -> a -> b
$ \Ptr CLong
sliceLenPtr -> do
Ptr ()
-> CLong
-> Ptr CLong
-> Ptr CLong
-> Ptr CLong
-> Ptr CLong
-> IO CInt
pySliceGetIndicesEx
{-# LINE 67 "lib/CPython/Types/Slice.chs" #-}
slicePtr length' startPtr stopPtr stepPtr sliceLenPtr
>>= checkStatusCode
start <- fmap toInteger $ peek startPtr
stop <- fmap toInteger $ peek stopPtr
step <- fmap toInteger $ peek stepPtr
sliceLen <- fmap toInteger $ peek sliceLenPtr
return (start, stop, step, sliceLen)
foreign import ccall unsafe "CPython/Types/Slice.chs.h hscpython_PySlice_Type"
sliceType'_ :: (IO (C2HSImp.Ptr ()))
foreign import ccall safe "CPython/Types/Slice.chs.h PySlice_New"
pySliceNew :: ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr ()) -> (IO (C2HSImp.Ptr ())))))
foreign import ccall safe "CPython/Types/Slice.chs.h PySlice_GetIndicesEx"
pySliceGetIndicesEx :: ((C2HSImp.Ptr ()) -> (C2HSImp.CLong -> ((C2HSImp.Ptr C2HSImp.CLong) -> ((C2HSImp.Ptr C2HSImp.CLong) -> ((C2HSImp.Ptr C2HSImp.CLong) -> ((C2HSImp.Ptr C2HSImp.CLong) -> (IO C2HSImp.CInt)))))))