1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
|
-- -*-haskell-*-
-- GIMP Toolkit (GTK)
--
-- Author : Axel Simon
--
-- Created: 19 March 2002
--
-- Copyright (C) 2002 Axel Simon
--
-- This library is free software; you can redistribute it and/or
-- modify it under the terms of the GNU Lesser General Public
-- License as published by the Free Software Foundation; either
-- version 2.1 of the License, or (at your option) any later version.
--
-- This library is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-- Lesser General Public License for more details.
--
-- |
-- Maintainer : gtk2hs-users@lists.sourceforge.net
-- Stability : provisional
-- Portability : portable (depends on GHC)
--
-- Defines functions to extract data from a GList and to produce a GList from
-- a list of pointers.
--
-- * The same for GSList.
--
module System.Glib.GList (
GList,
readGList,
fromGList,
toGList,
withGList,
GSList,
readGSList,
fromGSList,
fromGSListRev,
toGSList,
withGSList,
) where
import Foreign
import Control.Exception (bracket)
import Control.Monad (foldM)
{# context lib="glib" prefix="g" #}
{#pointer * GList#}
{#pointer * GSList#}
-- methods
-- Turn a GList into a list of pointers but don't destroy the list.
--
readGList :: GList -> IO [Ptr a]
readGList glist
| glist==nullPtr = return []
| otherwise = do
x <- {#get GList->data#} glist
glist' <- {#get GList->next#} glist
xs <- readGList glist'
return (castPtr x:xs)
-- Turn a GList into a list of pointers (freeing the GList in the process).
--
fromGList :: GList -> IO [Ptr a]
fromGList glist = do
glist' <- {#call unsafe list_reverse#} glist
extractList glist' []
where
extractList gl xs
| gl==nullPtr = return xs
| otherwise = do
x <- {#get GList.data#} gl
gl' <- {#call unsafe list_delete_link#} gl gl
extractList gl' (castPtr x:xs)
-- Turn a GSList into a list of pointers but don't destroy the list.
--
readGSList :: GSList -> IO [Ptr a]
readGSList gslist
| gslist==nullPtr = return []
| otherwise = do
x <- {#get GSList->data#} gslist
gslist' <- {#get GSList->next#} gslist
xs <- readGSList gslist'
return (castPtr x:xs)
-- Turn a GSList into a list of pointers (freeing the GSList in the process).
--
fromGSList :: GSList -> IO [Ptr a]
fromGSList gslist
| gslist==nullPtr = return []
| otherwise = do
x <- {#get GSList->data#} gslist
gslist' <- {#call unsafe slist_delete_link#} gslist gslist
xs <- fromGSList gslist'
return (castPtr x:xs)
-- Turn a GSList into a list of pointers and reverse it.
--
fromGSListRev :: GSList -> IO [Ptr a]
fromGSListRev gslist =
extractList gslist []
where
extractList gslist xs
| gslist==nullPtr = return xs
| otherwise = do
x <- {#get GSList->data#} gslist
gslist' <- {#call unsafe slist_delete_link#} gslist gslist
extractList gslist' (castPtr x:xs)
-- Turn a list of something into a GList.
--
toGList :: [Ptr a] -> IO GList
toGList = foldM prepend nullPtr . reverse
where
-- prepend :: GList -> Ptr a -> IO GList
prepend l x = {#call unsafe list_prepend#} l (castPtr x)
-- Turn a list of something into a GSList.
--
toGSList :: [Ptr a] -> IO GSList
toGSList = foldM prepend nullPtr . reverse
where
-- prepend :: GSList -> Ptr a -> IO GList
prepend l x = {#call unsafe slist_prepend#} l (castPtr x)
-- Temporarily allocate a list of something
--
withGList :: [Ptr a] -> (GSList -> IO b) -> IO b
withGList xs = bracket (toGList xs) {# call unsafe g_list_free #}
-- Temporarily allocate a list of something
--
withGSList :: [Ptr a] -> (GSList -> IO b) -> IO b
withGSList xs = bracket (toGSList xs) {# call unsafe g_slist_free #}
|