-- GENERATED by C->Haskell Compiler, version 0.28.7 Switcheroo, 25 November 2017 (Haskell)
-- Edit the ORIGNAL .chs file instead!


{-# LINE 1 "lib/CPython/Types/List.chs" #-}
{-# LANGUAGE ForeignFunctionInterface #-}

-- Copyright (C) 2009 John Millikin <jmillikin@gmail.com>
--
-- This program is free software: you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation, either version 3 of the License, or
-- any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this program.  If not, see <http://www.gnu.org/licenses/>.

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

-- | Convert any object implementing the iterator protocol to a 'List'.
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" #-}


-- | Returns the object at a given position in the list. The position must be
-- positive; indexing from the end of the list is not supported. If the
-- position is out of bounds, throws an @IndexError@ exception.
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" #-}


-- | Set the item at a given index.
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

-- | Inserts /item/ into the list in front of the given index. Throws an
-- exception if unsuccessful. Analogous to @list.insert(index, item)@.
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 /item/ to the end of th list. Throws an exception if unsuccessful.
-- Analogous to @list.append(item)@.
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" #-}


-- | Return a list of the objects in list containing the objects between
-- the given indexes. Throws an exception if unsuccessful. Analogous to
-- @list[low:high]@. Negative indices, as when slicing from Python, are not
-- supported.
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" #-}


-- | Sets the slice of a list between /low/ and /high/ to the contents of
-- a replacement list. Analogous to @list[low:high] = replacement@. The
-- replacement may be 'Nothing', indicating the assignment of an empty list
-- (slice deletion). Negative indices, as when slicing from Python, are not
-- supported.
setSlice
  :: List
  -> Integer -- ^ Low
  -> Integer -- ^ High
  -> Maybe List -- ^ Replacement
  -> 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 the items of a list in place. This is equivalent to @list.sort()@.
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" #-}


-- | Reverses the items of a list in place. This is equivalent to
-- @list.reverse()@.
reverse :: (List) -> IO ((()))
reverse a1 =
  withObject a1 $ \a1' -> 
  reverse'_ a1' >>= \res ->
  checkStatusCode res >>= \res' ->
  return (res')

{-# LINE 147 "lib/CPython/Types/List.chs" #-}


-- | Return a new 'Tuple' containing the contents of a list; equivalent to
-- @tuple(list)@.
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 ())))