{-# 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 = ((([Ptr a] -> [Ptr a] -> [Ptr a]) -> ([Ptr a], [Ptr a]) -> [Ptr a]
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry [Ptr a] -> [Ptr a] -> [Ptr a]
forall a. [a] -> [a] -> [a]
appendReverse (([Ptr a], [Ptr a]) -> [Ptr a])
-> Maybe ([Ptr a], [Ptr a]) -> Maybe [Ptr a]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>) (Maybe ([Ptr a], [Ptr a]) -> Maybe [Ptr a])
-> IO (Maybe ([Ptr a], [Ptr a])) -> IO (Maybe [Ptr a])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>) (IO (Maybe ([Ptr a], [Ptr a])) -> IO (Maybe [Ptr a]))
-> (Ptr (GList a) -> IO (Maybe ([Ptr a], [Ptr a])))
-> Ptr (GList a)
-> IO (Maybe [Ptr a])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ptr (GList a) -> IO (Maybe ([Ptr a], [Ptr a]))
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 [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
`appendReverse` (a
x a -> [a] -> [a]
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 -> Maybe ([Ptr a], [Ptr a]) -> IO (Maybe ([Ptr a], [Ptr a]))
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe ([Ptr a], [Ptr a])
forall a. Maybe a
Nothing
	Ptr (GList a)
p -> ([Ptr a], [Ptr a]) -> Maybe ([Ptr a], [Ptr a])
forall a. a -> Maybe a
Just (([Ptr a], [Ptr a]) -> Maybe ([Ptr a], [Ptr a]))
-> IO ([Ptr a], [Ptr a]) -> IO (Maybe ([Ptr a], [Ptr a]))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (
		(,)	([Ptr a] -> [Ptr a] -> ([Ptr a], [Ptr a]))
-> IO [Ptr a] -> IO ([Ptr a] -> ([Ptr a], [Ptr a]))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Ptr (GList a) -> IO [Ptr a]
forall a. Ptr (GList a) -> IO [Ptr a]
g_list_to_prev_list (Ptr (GList a) -> IO [Ptr a]) -> IO (Ptr (GList a)) -> IO [Ptr a]
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< (\Ptr (GList a)
hsc_ptr -> Ptr (GList a) -> Int -> IO (Ptr (GList a))
forall b. Ptr b -> Int -> IO (Ptr (GList a))
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" #-}
			IO ([Ptr a] -> ([Ptr a], [Ptr a]))
-> IO [Ptr a] -> IO ([Ptr a], [Ptr a])
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ptr (GList a) -> IO [Ptr a]
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 -> [Ptr a] -> IO [Ptr a]
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure []
	Ptr (GList a)
p -> (:)
		(Ptr a -> [Ptr a] -> [Ptr a])
-> IO (Ptr a) -> IO ([Ptr a] -> [Ptr a])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (\Ptr (GList a)
hsc_ptr -> Ptr (GList a) -> Int -> IO (Ptr a)
forall b. Ptr b -> Int -> IO (Ptr a)
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" #-}
		IO ([Ptr a] -> [Ptr a]) -> IO [Ptr a] -> IO [Ptr a]
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Ptr (GList a) -> IO [Ptr a]
forall a. Ptr (GList a) -> IO [Ptr a]
g_list_to_prev_list (Ptr (GList a) -> IO [Ptr a]) -> IO (Ptr (GList a)) -> IO [Ptr a]
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< (\Ptr (GList a)
hsc_ptr -> Ptr (GList a) -> Int -> IO (Ptr (GList a))
forall b. Ptr b -> Int -> IO (Ptr (GList a))
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 -> [Ptr a] -> IO [Ptr a]
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure []
	Ptr (GList a)
p -> (:)
		(Ptr a -> [Ptr a] -> [Ptr a])
-> IO (Ptr a) -> IO ([Ptr a] -> [Ptr a])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (\Ptr (GList a)
hsc_ptr -> Ptr (GList a) -> Int -> IO (Ptr a)
forall b. Ptr b -> Int -> IO (Ptr a)
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" #-}
		IO ([Ptr a] -> [Ptr a]) -> IO [Ptr a] -> IO [Ptr a]
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Ptr (GList a) -> IO [Ptr a]
forall a. Ptr (GList a) -> IO [Ptr a]
g_list_to_next_list (Ptr (GList a) -> IO [Ptr a]) -> IO (Ptr (GList a)) -> IO [Ptr a]
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< (\Ptr (GList a)
hsc_ptr -> Ptr (GList a) -> Int -> IO (Ptr (GList a))
forall b. Ptr b -> Int -> IO (Ptr (GList a))
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 -> Maybe (Ptr (GList a), Ptr a, Ptr (GList a))
-> IO (Maybe (Ptr (GList a), Ptr a, Ptr (GList a)))
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe (Ptr (GList a), Ptr a, Ptr (GList a))
forall a. Maybe a
Nothing
	Ptr (GList a)
p -> ((Ptr (GList a), Ptr a, Ptr (GList a))
-> Maybe (Ptr (GList a), Ptr a, Ptr (GList a))
forall a. a -> Maybe a
Just ((Ptr (GList a), Ptr a, Ptr (GList a))
 -> Maybe (Ptr (GList a), Ptr a, Ptr (GList a)))
-> IO (Ptr (GList a), Ptr a, Ptr (GList a))
-> IO (Maybe (Ptr (GList a), Ptr a, Ptr (GList a)))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>) (IO (Ptr (GList a), Ptr a, Ptr (GList a))
 -> IO (Maybe (Ptr (GList a), Ptr a, Ptr (GList a))))
-> IO (Ptr (GList a), Ptr a, Ptr (GList a))
-> IO (Maybe (Ptr (GList a), Ptr a, Ptr (GList a)))
forall a b. (a -> b) -> a -> b
$ (,,)
		(Ptr (GList a)
 -> Ptr a -> Ptr (GList a) -> (Ptr (GList a), Ptr a, Ptr (GList a)))
-> IO (Ptr (GList a))
-> IO
     (Ptr a -> Ptr (GList a) -> (Ptr (GList a), Ptr a, Ptr (GList a)))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (\Ptr (GList a)
hsc_ptr -> Ptr (GList a) -> Int -> IO (Ptr (GList a))
forall b. Ptr b -> Int -> IO (Ptr (GList a))
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" #-}
		IO
  (Ptr a -> Ptr (GList a) -> (Ptr (GList a), Ptr a, Ptr (GList a)))
-> IO (Ptr a)
-> IO (Ptr (GList a) -> (Ptr (GList a), Ptr a, Ptr (GList a)))
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (\Ptr (GList a)
hsc_ptr -> Ptr (GList a) -> Int -> IO (Ptr a)
forall b. Ptr b -> Int -> IO (Ptr a)
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" #-}
		IO (Ptr (GList a) -> (Ptr (GList a), Ptr a, Ptr (GList a)))
-> IO (Ptr (GList a)) -> IO (Ptr (GList a), Ptr a, Ptr (GList a))
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (\Ptr (GList a)
hsc_ptr -> Ptr (GList a) -> Int -> IO (Ptr (GList a))
forall b. Ptr b -> Int -> IO (Ptr (GList a))
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 -> Maybe (Ptr a) -> IO (Maybe (Ptr a))
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe (Ptr a)
forall a. Maybe a
Nothing; Ptr (GList a)
p -> Ptr a -> Maybe (Ptr a)
forall a. a -> Maybe a
Just (Ptr a -> Maybe (Ptr a)) -> IO (Ptr a) -> IO (Maybe (Ptr a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (\Ptr (GList a)
hsc_ptr -> Ptr (GList a) -> Int -> IO (Ptr a)
forall b. Ptr b -> Int -> IO (Ptr a)
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 -> Maybe (Ptr (GList a)) -> IO (Maybe (Ptr (GList a)))
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe (Ptr (GList a))
forall a. Maybe a
Nothing; Ptr (GList a)
p -> Ptr (GList a) -> Maybe (Ptr (GList a))
forall a. a -> Maybe a
Just (Ptr (GList a) -> Maybe (Ptr (GList a)))
-> IO (Ptr (GList a)) -> IO (Maybe (Ptr (GList a)))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (\Ptr (GList a)
hsc_ptr -> Ptr (GList a) -> Int -> IO (Ptr (GList a))
forall b. Ptr b -> Int -> IO (Ptr (GList a))
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 ()