{-# 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
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
showList :: [GSList a] -> ShowS
$cshowList :: forall a. [GSList a] -> ShowS
show :: GSList a -> String
$cshow :: forall a. GSList a -> String
showsPrec :: Int -> GSList a -> ShowS
$cshowsPrec :: forall a. Int -> 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 = (,) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (\Ptr (GSList a)
hsc_ptr -> forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr (GSList a)
hsc_ptr Int
0) Ptr (GSList a)
p forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (\Ptr (GSList a)
hsc_ptr -> 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 forall a. Eq a => a -> a -> Bool
== forall a. Ptr a
nullPtr = forall (f :: * -> *) a. Applicative f => a -> f a
pure []
	| Bool
otherwise = do
		(Ptr a
p, Ptr (GSList a)
lst') <- forall a. Ptr (GSList a) -> IO (Ptr a, Ptr (GSList a))
g_slist_uncons Ptr (GSList a)
lst
		(Ptr a
p forall a. a -> [a] -> [a]
:) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> 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 = forall a. Ptr (GSList a) -> IO [Ptr a]
g_slist_to_list Ptr (GSList a)
lst forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* forall a. Ptr (GSList a) -> IO ()
c_g_slist_free Ptr (GSList a)
lst