{-# LINE 1 "lib/CPython/Protocols/Iterator.chs" #-}
{-# LANGUAGE ForeignFunctionInterface #-}
module CPython.Protocols.Iterator
( Iterator (..)
, SomeIterator
, castToIterator
, next
) where
import qualified Foreign.C.Types as C2HSImp
import qualified Foreign.Ptr as C2HSImp
import CPython.Internal
castToIterator :: Object a => a -> IO (Maybe SomeIterator)
castToIterator :: a -> IO (Maybe SomeIterator)
castToIterator obj :: a
obj =
a -> (Ptr () -> IO (Maybe SomeIterator)) -> IO (Maybe SomeIterator)
forall obj a b. Object obj => obj -> (Ptr a -> IO b) -> IO b
withObject a
obj ((Ptr () -> IO (Maybe SomeIterator)) -> IO (Maybe SomeIterator))
-> (Ptr () -> IO (Maybe SomeIterator)) -> IO (Maybe SomeIterator)
forall a b. (a -> b) -> a -> b
$ \objPtr :: Ptr ()
objPtr -> do
Bool
isIter <- (CInt -> Bool) -> IO CInt -> IO Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap CInt -> Bool
cToBool (IO CInt -> IO Bool) -> IO CInt -> IO Bool
forall a b. (a -> b) -> a -> b
$ Ptr () -> IO CInt
hscpythonPyIterCheck Ptr ()
objPtr
Maybe SomeIterator -> IO (Maybe SomeIterator)
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe SomeIterator -> IO (Maybe SomeIterator))
-> Maybe SomeIterator -> IO (Maybe SomeIterator)
forall a b. (a -> b) -> a -> b
$ if Bool
isIter
then SomeIterator -> Maybe SomeIterator
forall a. a -> Maybe a
Just (SomeIterator -> Maybe SomeIterator)
-> SomeIterator -> Maybe SomeIterator
forall a b. (a -> b) -> a -> b
$ a -> SomeIterator
forall a. Object a => a -> SomeIterator
unsafeCastToIterator a
obj
else Maybe SomeIterator
forall a. Maybe a
Nothing
next :: Iterator iter => iter -> IO (Maybe SomeObject)
next :: iter -> IO (Maybe SomeObject)
next iter :: iter
iter =
iter -> (Ptr () -> IO (Maybe SomeObject)) -> IO (Maybe SomeObject)
forall obj a b. Object obj => obj -> (Ptr a -> IO b) -> IO b
withObject iter
iter ((Ptr () -> IO (Maybe SomeObject)) -> IO (Maybe SomeObject))
-> (Ptr () -> IO (Maybe SomeObject)) -> IO (Maybe SomeObject)
forall a b. (a -> b) -> a -> b
$ \iterPtr :: Ptr ()
iterPtr -> do
Ptr ()
raw <- Ptr () -> IO (Ptr ())
pyIterNext Ptr ()
iterPtr
if raw == nullPtr
then do
err <- pyErrOccurred
{-# LINE 47 "lib/CPython/Protocols/Iterator.chs" #-}
exceptionIf $ err /= nullPtr
return Nothing
else fmap Just $ stealObject raw
foreign import ccall safe "CPython/Protocols/Iterator.chs.h hscpython_PyIter_Check"
hscpythonPyIterCheck :: ((C2HSImp.Ptr ()) -> (IO C2HSImp.CInt))
foreign import ccall safe "CPython/Protocols/Iterator.chs.h PyIter_Next"
pyIterNext :: ((C2HSImp.Ptr ()) -> (IO (C2HSImp.Ptr ())))
foreign import ccall safe "CPython/Protocols/Iterator.chs.h PyErr_Occurred"
pyErrOccurred :: (IO (C2HSImp.Ptr ()))