{-# LINE 1 "src/System/GLib/DoublyLinkedLists.hsc" #-}
{-# LANGUAGE LambdaCase #-}
{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}

module System.GLib.DoublyLinkedLists (
	-- * TYPE
	GList,

	-- * LIST
	g_list_to_list, g_list_to_prev_next_lists,

	-- * POINTER
	g_list_prev_data_next, g_list_data, g_list_prev, g_list_next,

	-- * FREE
	c_g_list_free ) where

import Foreign.Ptr
import Foreign.Ptr.Misc
import Foreign.Storable



data GList a

g_list_to_list :: Ptr (GList a) -> IO (Maybe [Ptr a])
g_list_to_list :: forall a. Ptr (GList a) -> IO (Maybe [Ptr a])
g_list_to_list = ((forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry forall a. [a] -> [a] -> [a]
appendReverse forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Ptr (GList a) -> IO (Maybe ([Ptr a], [Ptr a]))
g_list_to_prev_next_lists

appendReverse :: [a] -> [a] -> [a]
[] appendReverse :: forall a. [a] -> [a] -> [a]
`appendReverse` [a]
ys = [a]
ys
(a
x : [a]
xs) `appendReverse` [a]
ys = [a]
xs forall a. [a] -> [a] -> [a]
`appendReverse` (a
x forall a. a -> [a] -> [a]
: [a]
ys)

g_list_to_prev_next_lists :: Ptr (GList a) -> IO (Maybe ([Ptr a], [Ptr a]))
g_list_to_prev_next_lists :: forall a. Ptr (GList a) -> IO (Maybe ([Ptr a], [Ptr a]))
g_list_to_prev_next_lists = \case
	Ptr (GList a)
NullPtr -> forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a. Maybe a
Nothing
	Ptr (GList a)
p -> forall a. a -> Maybe a
Just forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (
		(,)	forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (forall a. Ptr (GList a) -> IO [Ptr a]
g_list_to_prev_list forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< (\Ptr (GList a)
hsc_ptr -> forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr (GList a)
hsc_ptr Int
16) Ptr (GList a)
p)
{-# LINE 37 "src/System/GLib/DoublyLinkedLists.hsc" #-}
			forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall a. Ptr (GList a) -> IO [Ptr a]
g_list_to_next_list Ptr (GList a)
p )

g_list_to_prev_list :: Ptr (GList a) -> IO [Ptr a]
g_list_to_prev_list :: forall a. Ptr (GList a) -> IO [Ptr a]
g_list_to_prev_list = \case
	Ptr (GList a)
NullPtr -> forall (f :: * -> *) a. Applicative f => a -> f a
pure []
	Ptr (GList a)
p -> (:)
		forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (\Ptr (GList a)
hsc_ptr -> forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr (GList a)
hsc_ptr Int
0) Ptr (GList a)
p
{-# LINE 44 "src/System/GLib/DoublyLinkedLists.hsc" #-}
		forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (forall a. Ptr (GList a) -> IO [Ptr a]
g_list_to_prev_list forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< (\Ptr (GList a)
hsc_ptr -> forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr (GList a)
hsc_ptr Int
16) Ptr (GList a)
p)
{-# LINE 45 "src/System/GLib/DoublyLinkedLists.hsc" #-}

g_list_to_next_list :: Ptr (GList a) -> IO [Ptr a]
g_list_to_next_list :: forall a. Ptr (GList a) -> IO [Ptr a]
g_list_to_next_list = \case
	Ptr (GList a)
NullPtr -> forall (f :: * -> *) a. Applicative f => a -> f a
pure []
	Ptr (GList a)
p -> (:)
		forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (\Ptr (GList a)
hsc_ptr -> forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr (GList a)
hsc_ptr Int
0) Ptr (GList a)
p
{-# LINE 51 "src/System/GLib/DoublyLinkedLists.hsc" #-}
		forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (forall a. Ptr (GList a) -> IO [Ptr a]
g_list_to_next_list forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< (\Ptr (GList a)
hsc_ptr -> forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr (GList a)
hsc_ptr Int
8) Ptr (GList a)
p)
{-# LINE 52 "src/System/GLib/DoublyLinkedLists.hsc" #-}

g_list_prev_data_next ::
	Ptr (GList a) -> IO (Maybe (Ptr (GList a), Ptr a, Ptr (GList a)))
g_list_prev_data_next :: forall a.
Ptr (GList a) -> IO (Maybe (Ptr (GList a), Ptr a, Ptr (GList a)))
g_list_prev_data_next = \case
	Ptr (GList a)
NullPtr -> forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a. Maybe a
Nothing
	Ptr (GList a)
p -> (forall a. a -> Maybe a
Just forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>) forall a b. (a -> b) -> a -> b
$ (,,)
		forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (\Ptr (GList a)
hsc_ptr -> forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr (GList a)
hsc_ptr Int
16) Ptr (GList a)
p
{-# LINE 59 "src/System/GLib/DoublyLinkedLists.hsc" #-}
		forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (\Ptr (GList a)
hsc_ptr -> forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr (GList a)
hsc_ptr Int
0) Ptr (GList a)
p
{-# LINE 60 "src/System/GLib/DoublyLinkedLists.hsc" #-}
		forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (\Ptr (GList a)
hsc_ptr -> forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr (GList a)
hsc_ptr Int
8) Ptr (GList a)
p
{-# LINE 61 "src/System/GLib/DoublyLinkedLists.hsc" #-}

g_list_data :: Ptr (GList a) -> IO (Maybe (Ptr a))
g_list_data :: forall a. Ptr (GList a) -> IO (Maybe (Ptr a))
g_list_data = \case Ptr (GList a)
NullPtr -> forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a. Maybe a
Nothing; Ptr (GList a)
p -> forall a. a -> Maybe a
Just forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (\Ptr (GList a)
hsc_ptr -> forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr (GList a)
hsc_ptr Int
0) Ptr (GList a)
p
{-# LINE 64 "src/System/GLib/DoublyLinkedLists.hsc" #-}

g_list_prev, g_list_next :: Ptr (GList a) -> IO (Maybe (Ptr (GList a)))
g_list_prev :: forall a. Ptr (GList a) -> IO (Maybe (Ptr (GList a)))
g_list_prev = \case Ptr (GList a)
NullPtr -> forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a. Maybe a
Nothing; Ptr (GList a)
p -> forall a. a -> Maybe a
Just forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (\Ptr (GList a)
hsc_ptr -> forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr (GList a)
hsc_ptr Int
16) Ptr (GList a)
p
{-# LINE 67 "src/System/GLib/DoublyLinkedLists.hsc" #-}
g_list_next = \case NullPtr -> pure Nothing; p -> Just <$> (\hsc_ptr -> peekByteOff hsc_ptr 8) p
{-# LINE 68 "src/System/GLib/DoublyLinkedLists.hsc" #-}

foreign import ccall "g_list_free" c_g_list_free :: Ptr (GList a) -> IO ()