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

Contains the public fields of a
[Queue][glib-Double-ended-Queues].
-}

module GI.GLib.Structs.Queue
    ( 

-- * Exported types
    Queue(..)                               ,
    noQueue                                 ,


 -- * Methods
-- ** queueClear
    queueClear                              ,


-- ** queueFree
    queueFree                               ,


-- ** queueFreeFull
    queueFreeFull                           ,


-- ** queueGetLength
    queueGetLength                          ,


-- ** queueIndex
    queueIndex                              ,


-- ** queueInit
    queueInit                               ,


-- ** queueIsEmpty
    queueIsEmpty                            ,


-- ** queuePushHead
    queuePushHead                           ,


-- ** queuePushNth
    queuePushNth                            ,


-- ** queuePushTail
    queuePushTail                           ,


-- ** queueRemove
    queueRemove                             ,


-- ** queueRemoveAll
    queueRemoveAll                          ,


-- ** queueReverse
    queueReverse                            ,




 -- * Properties
-- ** Head
    queueReadHead                           ,


-- ** Length
    queueReadLength                         ,


-- ** Tail
    queueReadTail                           ,




    ) where

import Prelude ()
import Data.GI.Base.ShortPrelude

import qualified Data.Text as T
import qualified Data.ByteString.Char8 as B
import qualified Data.Map as Map

import GI.GLib.Types
import GI.GLib.Callbacks

newtype Queue = Queue (ForeignPtr Queue)
noQueue :: Maybe Queue
noQueue = Nothing

queueReadHead :: Queue -> IO ([Ptr ()])
queueReadHead s = withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 0) :: IO (Ptr (GList (Ptr ())))
    val' <- unpackGList val
    return val'

queueReadTail :: Queue -> IO ([Ptr ()])
queueReadTail s = withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 8) :: IO (Ptr (GList (Ptr ())))
    val' <- unpackGList val
    return val'

queueReadLength :: Queue -> IO Word32
queueReadLength s = withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 16) :: IO Word32
    return val

-- method Queue::clear
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "GLib" "Queue", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "GLib" "Queue", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TBasicType TVoid
-- throws : False
-- Skip return : False

foreign import ccall "g_queue_clear" g_queue_clear :: 
    Ptr Queue ->                            -- _obj : TInterface "GLib" "Queue"
    IO ()


queueClear ::
    (MonadIO m) =>
    Queue ->                                -- _obj
    m ()
queueClear _obj = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    g_queue_clear _obj'
    touchManagedPtr _obj
    return ()

-- method Queue::free
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "GLib" "Queue", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "GLib" "Queue", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TBasicType TVoid
-- throws : False
-- Skip return : False

foreign import ccall "g_queue_free" g_queue_free :: 
    Ptr Queue ->                            -- _obj : TInterface "GLib" "Queue"
    IO ()


queueFree ::
    (MonadIO m) =>
    Queue ->                                -- _obj
    m ()
queueFree _obj = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    g_queue_free _obj'
    touchManagedPtr _obj
    return ()

-- method Queue::free_full
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "GLib" "Queue", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "free_func", argType = TInterface "GLib" "DestroyNotify", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeAsync, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "GLib" "Queue", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "free_func", argType = TInterface "GLib" "DestroyNotify", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeAsync, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TBasicType TVoid
-- throws : False
-- Skip return : False

foreign import ccall "g_queue_free_full" g_queue_free_full :: 
    Ptr Queue ->                            -- _obj : TInterface "GLib" "Queue"
    FunPtr DestroyNotifyC ->                -- free_func : TInterface "GLib" "DestroyNotify"
    IO ()


queueFreeFull ::
    (MonadIO m) =>
    Queue ->                                -- _obj
    DestroyNotify ->                        -- free_func
    m ()
queueFreeFull _obj free_func = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    ptrfree_func <- callocMem :: IO (Ptr (FunPtr DestroyNotifyC))
    free_func' <- mkDestroyNotify (destroyNotifyWrapper (Just ptrfree_func) free_func)
    poke ptrfree_func free_func'
    g_queue_free_full _obj' free_func'
    touchManagedPtr _obj
    return ()

-- method Queue::get_length
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "GLib" "Queue", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "GLib" "Queue", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TBasicType TUInt32
-- throws : False
-- Skip return : False

foreign import ccall "g_queue_get_length" g_queue_get_length :: 
    Ptr Queue ->                            -- _obj : TInterface "GLib" "Queue"
    IO Word32


queueGetLength ::
    (MonadIO m) =>
    Queue ->                                -- _obj
    m Word32
queueGetLength _obj = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    result <- g_queue_get_length _obj'
    touchManagedPtr _obj
    return result

-- method Queue::index
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "GLib" "Queue", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "data", argType = TBasicType TVoid, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "GLib" "Queue", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "data", argType = TBasicType TVoid, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TBasicType TInt32
-- throws : False
-- Skip return : False

foreign import ccall "g_queue_index" g_queue_index :: 
    Ptr Queue ->                            -- _obj : TInterface "GLib" "Queue"
    Ptr () ->                               -- data : TBasicType TVoid
    IO Int32


queueIndex ::
    (MonadIO m) =>
    Queue ->                                -- _obj
    Ptr () ->                               -- data
    m Int32
queueIndex _obj data_ = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    result <- g_queue_index _obj' data_
    touchManagedPtr _obj
    return result

-- method Queue::init
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "GLib" "Queue", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "GLib" "Queue", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TBasicType TVoid
-- throws : False
-- Skip return : False

foreign import ccall "g_queue_init" g_queue_init :: 
    Ptr Queue ->                            -- _obj : TInterface "GLib" "Queue"
    IO ()


queueInit ::
    (MonadIO m) =>
    Queue ->                                -- _obj
    m ()
queueInit _obj = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    g_queue_init _obj'
    touchManagedPtr _obj
    return ()

-- method Queue::is_empty
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "GLib" "Queue", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "GLib" "Queue", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TBasicType TBoolean
-- throws : False
-- Skip return : False

foreign import ccall "g_queue_is_empty" g_queue_is_empty :: 
    Ptr Queue ->                            -- _obj : TInterface "GLib" "Queue"
    IO CInt


queueIsEmpty ::
    (MonadIO m) =>
    Queue ->                                -- _obj
    m Bool
queueIsEmpty _obj = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    result <- g_queue_is_empty _obj'
    let result' = (/= 0) result
    touchManagedPtr _obj
    return result'

-- method Queue::push_head
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "GLib" "Queue", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "data", argType = TBasicType TVoid, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "GLib" "Queue", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "data", argType = TBasicType TVoid, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TBasicType TVoid
-- throws : False
-- Skip return : False

foreign import ccall "g_queue_push_head" g_queue_push_head :: 
    Ptr Queue ->                            -- _obj : TInterface "GLib" "Queue"
    Ptr () ->                               -- data : TBasicType TVoid
    IO ()


queuePushHead ::
    (MonadIO m) =>
    Queue ->                                -- _obj
    Ptr () ->                               -- data
    m ()
queuePushHead _obj data_ = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    g_queue_push_head _obj' data_
    touchManagedPtr _obj
    return ()

-- method Queue::push_nth
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "GLib" "Queue", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "data", argType = TBasicType TVoid, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "n", argType = TBasicType TInt32, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "GLib" "Queue", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "data", argType = TBasicType TVoid, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "n", argType = TBasicType TInt32, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TBasicType TVoid
-- throws : False
-- Skip return : False

foreign import ccall "g_queue_push_nth" g_queue_push_nth :: 
    Ptr Queue ->                            -- _obj : TInterface "GLib" "Queue"
    Ptr () ->                               -- data : TBasicType TVoid
    Int32 ->                                -- n : TBasicType TInt32
    IO ()


queuePushNth ::
    (MonadIO m) =>
    Queue ->                                -- _obj
    Ptr () ->                               -- data
    Int32 ->                                -- n
    m ()
queuePushNth _obj data_ n = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    g_queue_push_nth _obj' data_ n
    touchManagedPtr _obj
    return ()

-- method Queue::push_tail
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "GLib" "Queue", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "data", argType = TBasicType TVoid, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "GLib" "Queue", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "data", argType = TBasicType TVoid, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TBasicType TVoid
-- throws : False
-- Skip return : False

foreign import ccall "g_queue_push_tail" g_queue_push_tail :: 
    Ptr Queue ->                            -- _obj : TInterface "GLib" "Queue"
    Ptr () ->                               -- data : TBasicType TVoid
    IO ()


queuePushTail ::
    (MonadIO m) =>
    Queue ->                                -- _obj
    Ptr () ->                               -- data
    m ()
queuePushTail _obj data_ = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    g_queue_push_tail _obj' data_
    touchManagedPtr _obj
    return ()

-- method Queue::remove
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "GLib" "Queue", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "data", argType = TBasicType TVoid, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "GLib" "Queue", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "data", argType = TBasicType TVoid, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TBasicType TBoolean
-- throws : False
-- Skip return : False

foreign import ccall "g_queue_remove" g_queue_remove :: 
    Ptr Queue ->                            -- _obj : TInterface "GLib" "Queue"
    Ptr () ->                               -- data : TBasicType TVoid
    IO CInt


queueRemove ::
    (MonadIO m) =>
    Queue ->                                -- _obj
    Ptr () ->                               -- data
    m Bool
queueRemove _obj data_ = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    result <- g_queue_remove _obj' data_
    let result' = (/= 0) result
    touchManagedPtr _obj
    return result'

-- method Queue::remove_all
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "GLib" "Queue", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "data", argType = TBasicType TVoid, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "GLib" "Queue", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "data", argType = TBasicType TVoid, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TBasicType TUInt32
-- throws : False
-- Skip return : False

foreign import ccall "g_queue_remove_all" g_queue_remove_all :: 
    Ptr Queue ->                            -- _obj : TInterface "GLib" "Queue"
    Ptr () ->                               -- data : TBasicType TVoid
    IO Word32


queueRemoveAll ::
    (MonadIO m) =>
    Queue ->                                -- _obj
    Ptr () ->                               -- data
    m Word32
queueRemoveAll _obj data_ = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    result <- g_queue_remove_all _obj' data_
    touchManagedPtr _obj
    return result

-- method Queue::reverse
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "GLib" "Queue", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "GLib" "Queue", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TBasicType TVoid
-- throws : False
-- Skip return : False

foreign import ccall "g_queue_reverse" g_queue_reverse :: 
    Ptr Queue ->                            -- _obj : TInterface "GLib" "Queue"
    IO ()


queueReverse ::
    (MonadIO m) =>
    Queue ->                                -- _obj
    m ()
queueReverse _obj = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    g_queue_reverse _obj'
    touchManagedPtr _obj
    return ()