{- |
Copyright  : Will Thompson, Iñaki García Etxebarria and Jonas Platte
License    : LGPL-2.1
Maintainer : Iñaki García Etxebarria (garetxe@gmail.com)

The 'GI.GLib.Structs.SequenceIter.SequenceIter' struct is an opaque data type representing an
iterator pointing into a 'GI.GLib.Structs.Sequence.Sequence'.
-}

module GI.GLib.Structs.SequenceIter
    ( 

-- * Exported types
    SequenceIter(..)                        ,
    noSequenceIter                          ,


 -- * Methods
-- ** compare #method:compare#
#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
    SequenceIterCompareMethodInfo           ,
#endif
    sequenceIterCompare                     ,


-- ** getPosition #method:getPosition#
#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
    SequenceIterGetPositionMethodInfo       ,
#endif
    sequenceIterGetPosition                 ,


-- ** isBegin #method:isBegin#
#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
    SequenceIterIsBeginMethodInfo           ,
#endif
    sequenceIterIsBegin                     ,


-- ** isEnd #method:isEnd#
#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
    SequenceIterIsEndMethodInfo             ,
#endif
    sequenceIterIsEnd                       ,




    ) where

import Data.GI.Base.ShortPrelude
import qualified Data.GI.Base.ShortPrelude as SP
import qualified Data.GI.Base.Overloading as O
import qualified Prelude as P

import qualified Data.GI.Base.Attributes as GI.Attributes
import qualified Data.GI.Base.ManagedPtr as B.ManagedPtr
import qualified Data.GI.Base.GError as B.GError
import qualified Data.GI.Base.GVariant as B.GVariant
import qualified Data.GI.Base.GParamSpec as B.GParamSpec
import qualified Data.GI.Base.CallStack as B.CallStack
import qualified Data.Text as T
import qualified Data.ByteString.Char8 as B
import qualified Data.Map as Map
import qualified Foreign.Ptr as FP


newtype SequenceIter = SequenceIter (ManagedPtr SequenceIter)
-- XXX Wrapping a foreign struct/union with no known destructor or size, leak?
instance WrappedPtr SequenceIter where
    wrappedPtrCalloc = return nullPtr
    wrappedPtrCopy = return
    wrappedPtrFree = Nothing

noSequenceIter :: Maybe SequenceIter
noSequenceIter = Nothing


#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
instance O.HasAttributeList SequenceIter
type instance O.AttributeList SequenceIter = SequenceIterAttributeList
type SequenceIterAttributeList = ('[ ] :: [(Symbol, *)])
#endif

-- method SequenceIter::compare
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "a", argType = TInterface (Name {namespace = "GLib", name = "SequenceIter"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GSequenceIter", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "b", argType = TInterface (Name {namespace = "GLib", name = "SequenceIter"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GSequenceIter", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TInt)
-- throws : False
-- Skip return : False

foreign import ccall "g_sequence_iter_compare" g_sequence_iter_compare :: 
    Ptr SequenceIter ->                     -- a : TInterface (Name {namespace = "GLib", name = "SequenceIter"})
    Ptr SequenceIter ->                     -- b : TInterface (Name {namespace = "GLib", name = "SequenceIter"})
    IO Int32

{- |
Returns a negative number if /@a@/ comes before /@b@/, 0 if they are equal,
and a positive number if /@a@/ comes after /@b@/.

The /@a@/ and /@b@/ iterators must point into the same sequence.

@since 2.14
-}
sequenceIterCompare ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    SequenceIter
    {- ^ /@a@/: a 'GI.GLib.Structs.SequenceIter.SequenceIter' -}
    -> SequenceIter
    {- ^ /@b@/: a 'GI.GLib.Structs.SequenceIter.SequenceIter' -}
    -> m Int32
    {- ^ __Returns:__ a negative number if /@a@/ comes before /@b@/, 0 if they are
    equal, and a positive number if /@a@/ comes after /@b@/ -}
sequenceIterCompare a b = liftIO $ do
    a' <- unsafeManagedPtrGetPtr a
    b' <- unsafeManagedPtrGetPtr b
    result <- g_sequence_iter_compare a' b'
    touchManagedPtr a
    touchManagedPtr b
    return result

#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
data SequenceIterCompareMethodInfo
instance (signature ~ (SequenceIter -> m Int32), MonadIO m) => O.MethodInfo SequenceIterCompareMethodInfo SequenceIter signature where
    overloadedMethod _ = sequenceIterCompare

#endif

-- method SequenceIter::get_position
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "iter", argType = TInterface (Name {namespace = "GLib", name = "SequenceIter"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GSequenceIter", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TInt)
-- throws : False
-- Skip return : False

foreign import ccall "g_sequence_iter_get_position" g_sequence_iter_get_position :: 
    Ptr SequenceIter ->                     -- iter : TInterface (Name {namespace = "GLib", name = "SequenceIter"})
    IO Int32

{- |
Returns the position of /@iter@/

@since 2.14
-}
sequenceIterGetPosition ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    SequenceIter
    {- ^ /@iter@/: a 'GI.GLib.Structs.SequenceIter.SequenceIter' -}
    -> m Int32
    {- ^ __Returns:__ the position of /@iter@/ -}
sequenceIterGetPosition iter = liftIO $ do
    iter' <- unsafeManagedPtrGetPtr iter
    result <- g_sequence_iter_get_position iter'
    touchManagedPtr iter
    return result

#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
data SequenceIterGetPositionMethodInfo
instance (signature ~ (m Int32), MonadIO m) => O.MethodInfo SequenceIterGetPositionMethodInfo SequenceIter signature where
    overloadedMethod _ = sequenceIterGetPosition

#endif

-- method SequenceIter::is_begin
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "iter", argType = TInterface (Name {namespace = "GLib", name = "SequenceIter"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GSequenceIter", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TBoolean)
-- throws : False
-- Skip return : False

foreign import ccall "g_sequence_iter_is_begin" g_sequence_iter_is_begin :: 
    Ptr SequenceIter ->                     -- iter : TInterface (Name {namespace = "GLib", name = "SequenceIter"})
    IO CInt

{- |
Returns whether /@iter@/ is the begin iterator

@since 2.14
-}
sequenceIterIsBegin ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    SequenceIter
    {- ^ /@iter@/: a 'GI.GLib.Structs.SequenceIter.SequenceIter' -}
    -> m Bool
    {- ^ __Returns:__ whether /@iter@/ is the begin iterator -}
sequenceIterIsBegin iter = liftIO $ do
    iter' <- unsafeManagedPtrGetPtr iter
    result <- g_sequence_iter_is_begin iter'
    let result' = (/= 0) result
    touchManagedPtr iter
    return result'

#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
data SequenceIterIsBeginMethodInfo
instance (signature ~ (m Bool), MonadIO m) => O.MethodInfo SequenceIterIsBeginMethodInfo SequenceIter signature where
    overloadedMethod _ = sequenceIterIsBegin

#endif

-- method SequenceIter::is_end
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "iter", argType = TInterface (Name {namespace = "GLib", name = "SequenceIter"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GSequenceIter", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TBoolean)
-- throws : False
-- Skip return : False

foreign import ccall "g_sequence_iter_is_end" g_sequence_iter_is_end :: 
    Ptr SequenceIter ->                     -- iter : TInterface (Name {namespace = "GLib", name = "SequenceIter"})
    IO CInt

{- |
Returns whether /@iter@/ is the end iterator

@since 2.14
-}
sequenceIterIsEnd ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    SequenceIter
    {- ^ /@iter@/: a 'GI.GLib.Structs.SequenceIter.SequenceIter' -}
    -> m Bool
    {- ^ __Returns:__ Whether /@iter@/ is the end iterator -}
sequenceIterIsEnd iter = liftIO $ do
    iter' <- unsafeManagedPtrGetPtr iter
    result <- g_sequence_iter_is_end iter'
    let result' = (/= 0) result
    touchManagedPtr iter
    return result'

#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
data SequenceIterIsEndMethodInfo
instance (signature ~ (m Bool), MonadIO m) => O.MethodInfo SequenceIterIsEndMethodInfo SequenceIter signature where
    overloadedMethod _ = sequenceIterIsEnd

#endif

#if defined(ENABLE_OVERLOADING) && !defined(__HADDOCK_VERSION__)
type family ResolveSequenceIterMethod (t :: Symbol) (o :: *) :: * where
    ResolveSequenceIterMethod "compare" o = SequenceIterCompareMethodInfo
    ResolveSequenceIterMethod "isBegin" o = SequenceIterIsBeginMethodInfo
    ResolveSequenceIterMethod "isEnd" o = SequenceIterIsEndMethodInfo
    ResolveSequenceIterMethod "getPosition" o = SequenceIterGetPositionMethodInfo
    ResolveSequenceIterMethod l o = O.MethodResolutionFailed l o

instance (info ~ ResolveSequenceIterMethod t SequenceIter, O.MethodInfo info SequenceIter p) => O.IsLabelProxy t (SequenceIter -> p) where
    fromLabelProxy _ = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)

#if MIN_VERSION_base(4,9,0)
instance (info ~ ResolveSequenceIterMethod t SequenceIter, O.MethodInfo info SequenceIter p) => O.IsLabel t (SequenceIter -> p) where
#if MIN_VERSION_base(4,10,0)
    fromLabel = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)
#else
    fromLabel _ = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)
#endif
#endif

#endif