packages feed

glib-stopgap-0.1.0.0: src/System/GLib/Quarks/Internal.hsc

{-# LANGUAGE BlockArguments, LambdaCase #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}

module System.GLib.Quarks.Internal (
	GQuark(..),
	gQuarkFromString, gQuarkToString, gInternString, gUninternString,
	gQuarkTryString ) where

import Foreign.Storable
import Foreign.C.String
import Data.Word

import System.IO.Unsafe

#include <gmodule.h>

newtype GQuark = GQuark #{type GQuark} deriving (Eq, Storable)

instance Show GQuark where show _ = "GQuark"

gQuarkFromString :: String -> GQuark
gQuarkFromString s =
	unsafePerformIO $ GQuark <$> withCString s c_g_quark_from_string

foreign import ccall "g_quark_from_string" c_g_quark_from_string ::
	CString -> IO #{type GQuark}

gQuarkToString :: GQuark -> String
gQuarkToString (GQuark q) =
	unsafePerformIO $ peekCString =<< c_g_quark_to_string q

foreign import ccall "g_quark_to_string" c_g_quark_to_string ::
	#{type GQuark} -> IO CString

gQuarkTryString :: String -> IO (Maybe GQuark)
gQuarkTryString s = (<$> withCString s c_g_quark_try_string) \case
		0 -> Nothing; q -> Just $ GQuark q

foreign import ccall "g_quark_try_string" c_g_quark_try_string ::
	CString -> IO #{type GQuark}

newtype InternedString = InternedString CString deriving Eq

instance Show InternedString where show _ = "InternedString"

gInternString :: String -> InternedString
gInternString s =
	unsafePerformIO $ InternedString <$> withCString s c_g_intern_string

gUninternString :: InternedString -> String
gUninternString (InternedString i) = unsafePerformIO $ peekCString i

foreign import ccall "g_intern_string" c_g_intern_string ::
	CString -> IO CString