module CPython.Types.Tuple
( Tuple
, tupleType
, toTuple
, iterableToTuple
, fromTuple
, length
, getItem
, getSlice
, setItem
) where
import Prelude hiding (length)
import CPython.Internal hiding (new)
instance Concrete Tuple where
concreteType _ = tupleType
tupleType :: Type
tupleType =
unsafePerformIO $
let {res = tupleType'_} in
peekStaticObject res >>= \res' ->
return (res')
toTuple :: [SomeObject] -> IO Tuple
toTuple xs =
mapWith withObject xs $ \ptrs ->
withArrayLen ptrs $ \count array ->
hscpython_poke_tuple (fromIntegral count) array
>>= stealObject
iterableToTuple :: Object iter => iter -> IO Tuple
iterableToTuple iter = do
raw <- callObjectRaw tupleType =<< toTuple [toObject iter]
return $ unsafeCast raw
fromTuple :: Tuple -> IO [SomeObject]
fromTuple py =
withObject py $ \pyPtr ->
(pyTupleSize pyPtr >>=) $ \size ->
let size' = fromIntegral size :: Int in
withArray (replicate size' nullPtr) $ \ptrs ->
hscpython_peek_tuple pyPtr size ptrs >>
peekArray size' ptrs >>= mapM peekObject
length :: Tuple -> IO (Integer)
length a1 =
withObject a1 $ \a1' ->
length'_ a1' >>= \res ->
checkIntReturn res >>= \res' ->
return (res')
getItem :: Tuple -> Integer -> IO (SomeObject)
getItem a1 a2 =
withObject a1 $ \a1' ->
let {a2' = fromIntegral a2} in
getItem'_ a1' a2' >>= \res ->
peekObject res >>= \res' ->
return (res')
getSlice :: Tuple -> Integer -> Integer -> IO (Tuple)
getSlice a1 a2 a3 =
withObject a1 $ \a1' ->
let {a2' = fromIntegral a2} in
let {a3' = fromIntegral a3} in
getSlice'_ a1' a2' a3' >>= \res ->
stealObject res >>= \res' ->
return (res')
setItem :: Object o => Tuple -> Integer -> o -> IO ()
setItem self index x =
withObject self $ \selfPtr ->
withObject x $ \xPtr -> do
incref xPtr
pyTupleSetItem selfPtr (fromIntegral index) xPtr
>>= checkStatusCode
foreign import ccall unsafe "CPython/Types/Tuple.chs.h hscpython_PyTuple_Type"
tupleType'_ :: (Ptr ())
foreign import ccall safe "CPython/Types/Tuple.chs.h hscpython_poke_tuple"
hscpython_poke_tuple :: (CUInt -> ((Ptr (Ptr ())) -> (IO (Ptr ()))))
foreign import ccall safe "CPython/Types/Tuple.chs.h PyTuple_Size"
pyTupleSize :: ((Ptr ()) -> (IO CInt))
foreign import ccall safe "CPython/Types/Tuple.chs.h hscpython_peek_tuple"
hscpython_peek_tuple :: ((Ptr ()) -> (CInt -> ((Ptr (Ptr ())) -> (IO ()))))
foreign import ccall safe "CPython/Types/Tuple.chs.h PyTuple_Size"
length'_ :: ((Ptr ()) -> (IO CInt))
foreign import ccall safe "CPython/Types/Tuple.chs.h PyTuple_GetItem"
getItem'_ :: ((Ptr ()) -> (CInt -> (IO (Ptr ()))))
foreign import ccall safe "CPython/Types/Tuple.chs.h PyTuple_GetSlice"
getSlice'_ :: ((Ptr ()) -> (CInt -> (CInt -> (IO (Ptr ())))))
foreign import ccall safe "CPython/Types/Tuple.chs.h PyTuple_SetItem"
pyTupleSetItem :: ((Ptr ()) -> (CInt -> ((Ptr ()) -> (IO CInt))))