{-# LINE 1 "lib/CPython/Types/List.chs" #-}
{-# LANGUAGE ForeignFunctionInterface #-}
module CPython.Types.List
( List
, listType
, toList
, iterableToList
, fromList
, length
, getItem
, setItem
, insert
, append
, getSlice
, setSlice
, sort
, reverse
, toTuple
) where
import qualified Foreign.C.Types as C2HSImp
import qualified Foreign.Ptr as C2HSImp
import qualified System.IO.Unsafe as C2HSImp
import Prelude hiding (reverse, length)
import CPython.Internal hiding (new)
import qualified CPython.Types.Tuple as T
instance Concrete List where
concreteType :: List -> Type
concreteType _ = Type
listType
listType :: (Type)
listType =
C2HSImp.unsafePerformIO $
listType'_ >>= \res ->
peekStaticObject res >>= \res' ->
return (res')
{-# LINE 47 "lib/CPython/Types/List.chs" #-}
toList :: [SomeObject] -> IO List
toList xs =
mapWith withObject xs $ \ptrs ->
withArrayLen ptrs $ \count array ->
hscpython_poke_list (fromIntegral count) array
>>= stealObject
iterableToList :: Object iter => iter -> IO List
iterableToList iter = do
raw <- callObjectRaw listType =<< T.toTuple [toObject iter]
return $ unsafeCast raw
fromList :: List -> IO [SomeObject]
fromList :: List -> IO [SomeObject]
fromList py :: List
py =
List -> (Ptr () -> IO [SomeObject]) -> IO [SomeObject]
forall obj a b. Object obj => obj -> (Ptr a -> IO b) -> IO b
withObject List
py ((Ptr () -> IO [SomeObject]) -> IO [SomeObject])
-> (Ptr () -> IO [SomeObject]) -> IO [SomeObject]
forall a b. (a -> b) -> a -> b
$ \pyPtr :: Ptr ()
pyPtr ->
(Ptr () -> IO CLong
pyListSize Ptr ()
pyPtr IO CLong -> (CLong -> IO [SomeObject]) -> IO [SomeObject]
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>=) ((CLong -> IO [SomeObject]) -> IO [SomeObject])
-> (CLong -> IO [SomeObject]) -> IO [SomeObject]
forall a b. (a -> b) -> a -> b
$ \size :: CLong
size ->
let size' :: Int
size' = CLong -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral CLong
size :: Int in
[Ptr ()] -> (Ptr (Ptr ()) -> IO [SomeObject]) -> IO [SomeObject]
forall a b. Storable a => [a] -> (Ptr a -> IO b) -> IO b
withArray (Int -> Ptr () -> [Ptr ()]
forall a. Int -> a -> [a]
replicate Int
size' Ptr ()
forall a. Ptr a
nullPtr) ((Ptr (Ptr ()) -> IO [SomeObject]) -> IO [SomeObject])
-> (Ptr (Ptr ()) -> IO [SomeObject]) -> IO [SomeObject]
forall a b. (a -> b) -> a -> b
$ \ptrs :: Ptr (Ptr ())
ptrs ->
Ptr () -> CLong -> Ptr (Ptr ()) -> IO ()
hscpython_peek_list Ptr ()
pyPtr CLong
size Ptr (Ptr ())
ptrs IO () -> IO [Ptr ()] -> IO [Ptr ()]
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>>
Int -> Ptr (Ptr ()) -> IO [Ptr ()]
forall a. Storable a => Int -> Ptr a -> IO [a]
peekArray Int
size' Ptr (Ptr ())
ptrs IO [Ptr ()] -> ([Ptr ()] -> IO [SomeObject]) -> IO [SomeObject]
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Ptr () -> IO SomeObject) -> [Ptr ()] -> IO [SomeObject]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM Ptr () -> IO SomeObject
forall obj a. Object obj => Ptr a -> IO obj
peekObject
length :: (List) -> IO ((Integer))
length :: List -> IO Integer
length a1 :: List
a1 =
List -> (Ptr () -> IO Integer) -> IO Integer
forall obj a b. Object obj => obj -> (Ptr a -> IO b) -> IO b
withObject List
a1 ((Ptr () -> IO Integer) -> IO Integer)
-> (Ptr () -> IO Integer) -> IO Integer
forall a b. (a -> b) -> a -> b
$ \a1' :: Ptr ()
a1' ->
Ptr () -> IO CLong
length'_ Ptr ()
a1' IO CLong -> (CLong -> IO Integer) -> IO Integer
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \res :: CLong
res ->
CLong -> IO Integer
forall a. Integral a => a -> IO Integer
checkIntReturn CLong
res IO Integer -> (Integer -> IO Integer) -> IO Integer
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \res' :: Integer
res' ->
Integer -> IO Integer
forall (m :: * -> *) a. Monad m => a -> m a
return (Integer
res')
{-# LINE 73 "lib/CPython/Types/List.chs" #-}
getItem :: (List) -> (Integer) -> IO ((SomeObject))
getItem :: List -> Integer -> IO SomeObject
getItem a1 :: List
a1 a2 :: Integer
a2 =
List -> (Ptr () -> IO SomeObject) -> IO SomeObject
forall obj a b. Object obj => obj -> (Ptr a -> IO b) -> IO b
withObject List
a1 ((Ptr () -> IO SomeObject) -> IO SomeObject)
-> (Ptr () -> IO SomeObject) -> IO SomeObject
forall a b. (a -> b) -> a -> b
$ \a1' :: Ptr ()
a1' ->
let {a2' :: CLong
a2' = Integer -> CLong
forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
a2} in
Ptr () -> CLong -> IO (Ptr ())
getItem'_ Ptr ()
a1' CLong
a2' IO (Ptr ()) -> (Ptr () -> IO SomeObject) -> IO SomeObject
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \res :: Ptr ()
res ->
Ptr () -> IO SomeObject
forall obj a. Object obj => Ptr a -> IO obj
peekObject Ptr ()
res IO SomeObject -> (SomeObject -> IO SomeObject) -> IO SomeObject
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \res' :: SomeObject
res' ->
SomeObject -> IO SomeObject
forall (m :: * -> *) a. Monad m => a -> m a
return (SomeObject
res')
{-# LINE 81 "lib/CPython/Types/List.chs" #-}
setItem :: Object o => List -> Integer -> o -> IO ()
setItem self index x =
withObject self $ \selfPtr ->
withObject x $ \xPtr -> do
incref xPtr
pyListSetItem selfPtr (fromIntegral index) xPtr
>>= checkStatusCode
insert :: Object item => (List) -> (Integer) -> (item) -> IO ((()))
insert :: List -> Integer -> item -> IO ()
insert a1 :: List
a1 a2 :: Integer
a2 a3 :: item
a3 =
List -> (Ptr () -> IO ()) -> IO ()
forall obj a b. Object obj => obj -> (Ptr a -> IO b) -> IO b
withObject List
a1 ((Ptr () -> IO ()) -> IO ()) -> (Ptr () -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \a1' :: Ptr ()
a1' ->
let {a2' :: CLong
a2' = Integer -> CLong
forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
a2} in
item -> (Ptr () -> IO ()) -> IO ()
forall obj a b. Object obj => obj -> (Ptr a -> IO b) -> IO b
withObject item
a3 ((Ptr () -> IO ()) -> IO ()) -> (Ptr () -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \a3' :: Ptr ()
a3' ->
Ptr () -> CLong -> Ptr () -> IO CInt
insert'_ Ptr ()
a1' CLong
a2' Ptr ()
a3' IO CInt -> (CInt -> IO ()) -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \res :: CInt
res ->
CInt -> IO ()
checkStatusCode CInt
res IO () -> (() -> IO ()) -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \res' :: ()
res' ->
() -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return (()
res')
{-# LINE 99 "lib/CPython/Types/List.chs" #-}
append :: Object item => (List) -> (item) -> IO ((()))
append :: List -> item -> IO ()
append a1 :: List
a1 a2 :: item
a2 =
List -> (Ptr () -> IO ()) -> IO ()
forall obj a b. Object obj => obj -> (Ptr a -> IO b) -> IO b
withObject List
a1 ((Ptr () -> IO ()) -> IO ()) -> (Ptr () -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \a1' :: Ptr ()
a1' ->
item -> (Ptr () -> IO ()) -> IO ()
forall obj a b. Object obj => obj -> (Ptr a -> IO b) -> IO b
withObject item
a2 ((Ptr () -> IO ()) -> IO ()) -> (Ptr () -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \a2' :: Ptr ()
a2' ->
Ptr () -> Ptr () -> IO CInt
append'_ Ptr ()
a1' Ptr ()
a2' IO CInt -> (CInt -> IO ()) -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \res :: CInt
res ->
CInt -> IO ()
checkStatusCode CInt
res IO () -> (() -> IO ()) -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \res' :: ()
res' ->
() -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return (()
res')
{-# LINE 107 "lib/CPython/Types/List.chs" #-}
getSlice :: (List) -> (Integer) -> (Integer) -> IO ((List))
getSlice :: List -> Integer -> Integer -> IO List
getSlice a1 :: List
a1 a2 :: Integer
a2 a3 :: Integer
a3 =
List -> (Ptr () -> IO List) -> IO List
forall obj a b. Object obj => obj -> (Ptr a -> IO b) -> IO b
withObject List
a1 ((Ptr () -> IO List) -> IO List) -> (Ptr () -> IO List) -> IO List
forall a b. (a -> b) -> a -> b
$ \a1' :: Ptr ()
a1' ->
let {a2' :: CLong
a2' = Integer -> CLong
forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
a2} in
let {a3' :: CLong
a3' = Integer -> CLong
forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
a3} in
Ptr () -> CLong -> CLong -> IO (Ptr ())
getSlice'_ Ptr ()
a1' CLong
a2' CLong
a3' IO (Ptr ()) -> (Ptr () -> IO List) -> IO List
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \res :: Ptr ()
res ->
Ptr () -> IO List
forall obj a. Object obj => Ptr a -> IO obj
stealObject Ptr ()
res IO List -> (List -> IO List) -> IO List
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \res' :: List
res' ->
List -> IO List
forall (m :: * -> *) a. Monad m => a -> m a
return (List
res')
{-# LINE 117 "lib/CPython/Types/List.chs" #-}
setSlice
:: List
-> Integer
-> Integer
-> Maybe List
-> IO ()
setSlice :: List -> Integer -> Integer -> Maybe List -> IO ()
setSlice self :: List
self low :: Integer
low high :: Integer
high items :: Maybe List
items = let
low' :: CLong
low' = Integer -> CLong
forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
low
high' :: CLong
high' = Integer -> CLong
forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
high in
List -> (Ptr () -> IO ()) -> IO ()
forall obj a b. Object obj => obj -> (Ptr a -> IO b) -> IO b
withObject List
self ((Ptr () -> IO ()) -> IO ()) -> (Ptr () -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \selfPtr :: Ptr ()
selfPtr ->
(List -> (Ptr () -> IO ()) -> IO ())
-> Maybe List -> (Ptr () -> IO ()) -> IO ()
forall a b c.
(a -> (Ptr b -> IO c) -> IO c)
-> Maybe a -> (Ptr b -> IO c) -> IO c
maybeWith List -> (Ptr () -> IO ()) -> IO ()
forall obj a b. Object obj => obj -> (Ptr a -> IO b) -> IO b
withObject Maybe List
items ((Ptr () -> IO ()) -> IO ()) -> (Ptr () -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \itemsPtr :: Ptr ()
itemsPtr -> do
Ptr () -> CLong -> CLong -> Ptr () -> IO CInt
pyListSetSlice Ptr ()
selfPtr CLong
low' CLong
high' Ptr ()
itemsPtr
IO CInt -> (CInt -> IO ()) -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= CInt -> IO ()
checkStatusCode
sort :: (List) -> IO ((()))
sort :: List -> IO ()
sort a1 :: List
a1 =
List -> (Ptr () -> IO ()) -> IO ()
forall obj a b. Object obj => obj -> (Ptr a -> IO b) -> IO b
withObject List
a1 ((Ptr () -> IO ()) -> IO ()) -> (Ptr () -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \a1' :: Ptr ()
a1' ->
Ptr () -> IO CInt
sort'_ Ptr ()
a1' IO CInt -> (CInt -> IO ()) -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \res :: CInt
res ->
CInt -> IO ()
checkStatusCode CInt
res IO () -> (() -> IO ()) -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \res' :: ()
res' ->
() -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return (()
res')
{-# LINE 141 "lib/CPython/Types/List.chs" #-}
reverse :: (List) -> IO ((()))
reverse a1 =
withObject a1 $ \a1' ->
reverse'_ a1' >>= \res ->
checkStatusCode res >>= \res' ->
return (res')
{-# LINE 147 "lib/CPython/Types/List.chs" #-}
toTuple :: (List) -> IO ((Tuple))
toTuple a1 =
withObject a1 $ \a1' ->
toTuple'_ a1' >>= \res ->
stealObject res >>= \res' ->
return (res')
{-# LINE 153 "lib/CPython/Types/List.chs" #-}
foreign import ccall unsafe "CPython/Types/List.chs.h hscpython_PyList_Type"
listType'_ :: (IO (C2HSImp.Ptr ()))
foreign import ccall safe "CPython/Types/List.chs.h hscpython_poke_list"
hscpython_poke_list :: (C2HSImp.CULong -> ((C2HSImp.Ptr (C2HSImp.Ptr ())) -> (IO (C2HSImp.Ptr ()))))
foreign import ccall safe "CPython/Types/List.chs.h PyList_Size"
pyListSize :: ((C2HSImp.Ptr ()) -> (IO C2HSImp.CLong))
foreign import ccall safe "CPython/Types/List.chs.h hscpython_peek_list"
hscpython_peek_list :: ((C2HSImp.Ptr ()) -> (C2HSImp.CLong -> ((C2HSImp.Ptr (C2HSImp.Ptr ())) -> (IO ()))))
foreign import ccall safe "CPython/Types/List.chs.h PyList_Size"
length'_ :: ((C2HSImp.Ptr ()) -> (IO C2HSImp.CLong))
foreign import ccall safe "CPython/Types/List.chs.h PyList_GetItem"
getItem'_ :: ((C2HSImp.Ptr ()) -> (C2HSImp.CLong -> (IO (C2HSImp.Ptr ()))))
foreign import ccall safe "CPython/Types/List.chs.h PyList_SetItem"
pyListSetItem :: ((C2HSImp.Ptr ()) -> (C2HSImp.CLong -> ((C2HSImp.Ptr ()) -> (IO C2HSImp.CInt))))
foreign import ccall safe "CPython/Types/List.chs.h PyList_Insert"
insert'_ :: ((C2HSImp.Ptr ()) -> (C2HSImp.CLong -> ((C2HSImp.Ptr ()) -> (IO C2HSImp.CInt))))
foreign import ccall safe "CPython/Types/List.chs.h PyList_Append"
append'_ :: ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr ()) -> (IO C2HSImp.CInt)))
foreign import ccall safe "CPython/Types/List.chs.h PyList_GetSlice"
getSlice'_ :: ((C2HSImp.Ptr ()) -> (C2HSImp.CLong -> (C2HSImp.CLong -> (IO (C2HSImp.Ptr ())))))
foreign import ccall safe "CPython/Types/List.chs.h PyList_SetSlice"
pyListSetSlice :: ((C2HSImp.Ptr ()) -> (C2HSImp.CLong -> (C2HSImp.CLong -> ((C2HSImp.Ptr ()) -> (IO C2HSImp.CInt)))))
foreign import ccall safe "CPython/Types/List.chs.h PyList_Sort"
sort'_ :: ((C2HSImp.Ptr ()) -> (IO C2HSImp.CInt))
foreign import ccall safe "CPython/Types/List.chs.h PyList_Reverse"
reverse'_ :: ((C2HSImp.Ptr ()) -> (IO C2HSImp.CInt))
foreign import ccall safe "CPython/Types/List.chs.h PyList_AsTuple"
toTuple'_ :: ((C2HSImp.Ptr ()) -> (IO (C2HSImp.Ptr ())))