{- |
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 #GNode struct represents one node in a [n-ary tree][glib-N-ary-Trees].
-}

module GI.GLib.Structs.Node
    ( 

-- * Exported types
    Node(..)                                ,
    noNode                                  ,


 -- * Methods
-- ** nodeChildIndex
    nodeChildIndex                          ,


-- ** nodeChildPosition
    nodeChildPosition                       ,


-- ** nodeDepth
    nodeDepth                               ,


-- ** nodeDestroy
    nodeDestroy                             ,


-- ** nodeIsAncestor
    nodeIsAncestor                          ,


-- ** nodeMaxHeight
    nodeMaxHeight                           ,


-- ** nodeNChildren
    nodeNChildren                           ,


-- ** nodeNNodes
    nodeNNodes                              ,


-- ** nodeReverseChildren
    nodeReverseChildren                     ,


-- ** nodeUnlink
    nodeUnlink                              ,




 -- * Properties
-- ** Children
    nodeReadChildren                        ,


-- ** Data
    nodeReadData                            ,


-- ** Next
    nodeReadNext                            ,


-- ** Parent
    nodeReadParent                          ,


-- ** Prev
    nodeReadPrev                            ,




    ) 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 Node = Node (ForeignPtr Node)
noNode :: Maybe Node
noNode = Nothing

nodeReadData :: Node -> IO (Ptr ())
nodeReadData s = withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 0) :: IO (Ptr ())
    return val

nodeReadNext :: Node -> IO Node
nodeReadNext s = withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 8) :: IO (Ptr Node)
    val' <- (newPtr 40 Node) val
    return val'

nodeReadPrev :: Node -> IO Node
nodeReadPrev s = withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 16) :: IO (Ptr Node)
    val' <- (newPtr 40 Node) val
    return val'

nodeReadParent :: Node -> IO Node
nodeReadParent s = withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 24) :: IO (Ptr Node)
    val' <- (newPtr 40 Node) val
    return val'

nodeReadChildren :: Node -> IO Node
nodeReadChildren s = withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 32) :: IO (Ptr Node)
    val' <- (newPtr 40 Node) val
    return val'

-- method Node::child_index
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "GLib" "Node", 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" "Node", 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_node_child_index" g_node_child_index :: 
    Ptr Node ->                             -- _obj : TInterface "GLib" "Node"
    Ptr () ->                               -- data : TBasicType TVoid
    IO Int32


nodeChildIndex ::
    (MonadIO m) =>
    Node ->                                 -- _obj
    Ptr () ->                               -- data
    m Int32
nodeChildIndex _obj data_ = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    result <- g_node_child_index _obj' data_
    touchManagedPtr _obj
    return result

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

foreign import ccall "g_node_child_position" g_node_child_position :: 
    Ptr Node ->                             -- _obj : TInterface "GLib" "Node"
    Ptr Node ->                             -- child : TInterface "GLib" "Node"
    IO Int32


nodeChildPosition ::
    (MonadIO m) =>
    Node ->                                 -- _obj
    Node ->                                 -- child
    m Int32
nodeChildPosition _obj child = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    let child' = unsafeManagedPtrGetPtr child
    result <- g_node_child_position _obj' child'
    touchManagedPtr _obj
    touchManagedPtr child
    return result

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

foreign import ccall "g_node_depth" g_node_depth :: 
    Ptr Node ->                             -- _obj : TInterface "GLib" "Node"
    IO Word32


nodeDepth ::
    (MonadIO m) =>
    Node ->                                 -- _obj
    m Word32
nodeDepth _obj = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    result <- g_node_depth _obj'
    touchManagedPtr _obj
    return result

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

foreign import ccall "g_node_destroy" g_node_destroy :: 
    Ptr Node ->                             -- _obj : TInterface "GLib" "Node"
    IO ()


nodeDestroy ::
    (MonadIO m) =>
    Node ->                                 -- _obj
    m ()
nodeDestroy _obj = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    g_node_destroy _obj'
    touchManagedPtr _obj
    return ()

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

foreign import ccall "g_node_is_ancestor" g_node_is_ancestor :: 
    Ptr Node ->                             -- _obj : TInterface "GLib" "Node"
    Ptr Node ->                             -- descendant : TInterface "GLib" "Node"
    IO CInt


nodeIsAncestor ::
    (MonadIO m) =>
    Node ->                                 -- _obj
    Node ->                                 -- descendant
    m Bool
nodeIsAncestor _obj descendant = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    let descendant' = unsafeManagedPtrGetPtr descendant
    result <- g_node_is_ancestor _obj' descendant'
    let result' = (/= 0) result
    touchManagedPtr _obj
    touchManagedPtr descendant
    return result'

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

foreign import ccall "g_node_max_height" g_node_max_height :: 
    Ptr Node ->                             -- _obj : TInterface "GLib" "Node"
    IO Word32


nodeMaxHeight ::
    (MonadIO m) =>
    Node ->                                 -- _obj
    m Word32
nodeMaxHeight _obj = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    result <- g_node_max_height _obj'
    touchManagedPtr _obj
    return result

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

foreign import ccall "g_node_n_children" g_node_n_children :: 
    Ptr Node ->                             -- _obj : TInterface "GLib" "Node"
    IO Word32


nodeNChildren ::
    (MonadIO m) =>
    Node ->                                 -- _obj
    m Word32
nodeNChildren _obj = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    result <- g_node_n_children _obj'
    touchManagedPtr _obj
    return result

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

foreign import ccall "g_node_n_nodes" g_node_n_nodes :: 
    Ptr Node ->                             -- _obj : TInterface "GLib" "Node"
    CUInt ->                                -- flags : TInterface "GLib" "TraverseFlags"
    IO Word32


nodeNNodes ::
    (MonadIO m) =>
    Node ->                                 -- _obj
    [TraverseFlags] ->                      -- flags
    m Word32
nodeNNodes _obj flags = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    let flags' = gflagsToWord flags
    result <- g_node_n_nodes _obj' flags'
    touchManagedPtr _obj
    return result

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

foreign import ccall "g_node_reverse_children" g_node_reverse_children :: 
    Ptr Node ->                             -- _obj : TInterface "GLib" "Node"
    IO ()


nodeReverseChildren ::
    (MonadIO m) =>
    Node ->                                 -- _obj
    m ()
nodeReverseChildren _obj = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    g_node_reverse_children _obj'
    touchManagedPtr _obj
    return ()

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

foreign import ccall "g_node_unlink" g_node_unlink :: 
    Ptr Node ->                             -- _obj : TInterface "GLib" "Node"
    IO ()


nodeUnlink ::
    (MonadIO m) =>
    Node ->                                 -- _obj
    m ()
nodeUnlink _obj = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    g_node_unlink _obj'
    touchManagedPtr _obj
    return ()