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

module System.GLib.SinglyLinkedLists (GSList, g_slist_to_list, g_slist_to_list') where

import Foreign.Ptr
import Foreign.ForeignPtr hiding (newForeignPtr)
import Foreign.Storable



newtype GSList a = GSList (ForeignPtr (GSList a)) deriving Int -> GSList a -> ShowS
[GSList a] -> ShowS
GSList a -> String
(Int -> GSList a -> ShowS)
-> (GSList a -> String) -> ([GSList a] -> ShowS) -> Show (GSList a)
forall a. Int -> GSList a -> ShowS
forall a. [GSList a] -> ShowS
forall a. GSList a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. Int -> GSList a -> ShowS
showsPrec :: Int -> GSList a -> ShowS
$cshow :: forall a. GSList a -> String
show :: GSList a -> String
$cshowList :: forall a. [GSList a] -> ShowS
showList :: [GSList a] -> ShowS
Show

foreign import ccall "g_slist_free" c_g_slist_free :: Ptr (GSList a) -> IO ()

g_slist_uncons :: Ptr (GSList a) -> IO (Ptr a, Ptr (GSList a))
g_slist_uncons :: forall a. Ptr (GSList a) -> IO (Ptr a, Ptr (GSList a))
g_slist_uncons Ptr (GSList a)
p = (,) (Ptr a -> Ptr (GSList a) -> (Ptr a, Ptr (GSList a)))
-> IO (Ptr a) -> IO (Ptr (GSList a) -> (Ptr a, Ptr (GSList a)))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (\Ptr (GSList a)
hsc_ptr -> Ptr (GSList 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 (GSList a)
hsc_ptr Int
0) Ptr (GSList a)
p IO (Ptr (GSList a) -> (Ptr a, Ptr (GSList a)))
-> IO (Ptr (GSList a)) -> IO (Ptr a, Ptr (GSList 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 (GSList a)
hsc_ptr -> Ptr (GSList a) -> Int -> IO (Ptr (GSList a))
forall b. Ptr b -> Int -> IO (Ptr (GSList a))
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr (GSList a)
hsc_ptr Int
8) Ptr (GSList a)
p
{-# LINE 17 "src/System/GLib/SinglyLinkedLists.hsc" #-}

g_slist_to_list, g_slist_to_list' :: Ptr (GSList a) -> IO [Ptr a]
g_slist_to_list :: forall a. Ptr (GSList a) -> IO [Ptr a]
g_slist_to_list Ptr (GSList a)
lst
	| Ptr (GSList a)
lst Ptr (GSList a) -> Ptr (GSList a) -> Bool
forall a. Eq a => a -> a -> Bool
== Ptr (GSList a)
forall a. Ptr a
nullPtr = [Ptr a] -> IO [Ptr a]
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure []
	| Bool
otherwise = do
		(Ptr a
p, Ptr (GSList a)
lst') <- Ptr (GSList a) -> IO (Ptr a, Ptr (GSList a))
forall a. Ptr (GSList a) -> IO (Ptr a, Ptr (GSList a))
g_slist_uncons Ptr (GSList a)
lst
		(Ptr a
p Ptr a -> [Ptr a] -> [Ptr a]
forall a. a -> [a] -> [a]
:) ([Ptr a] -> [Ptr a]) -> IO [Ptr a] -> IO [Ptr a]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ptr (GSList a) -> IO [Ptr a]
forall a. Ptr (GSList a) -> IO [Ptr a]
g_slist_to_list Ptr (GSList a)
lst'

g_slist_to_list' :: forall a. Ptr (GSList a) -> IO [Ptr a]
g_slist_to_list' Ptr (GSList a)
lst = Ptr (GSList a) -> IO [Ptr a]
forall a. Ptr (GSList a) -> IO [Ptr a]
g_slist_to_list Ptr (GSList a)
lst IO [Ptr a] -> IO () -> IO [Ptr a]
forall a b. IO a -> IO b -> IO a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Ptr (GSList a) -> IO ()
forall a. Ptr (GSList a) -> IO ()
c_g_slist_free Ptr (GSList a)
lst