module Graphics.Text.Font.Choose.ObjectSet where

import Foreign.Ptr (Ptr)
import Foreign.C.String (CString, withCString)

import Control.Monad (forM)
import Control.Exception (bracket)
import Graphics.Text.Font.Choose.Result (throwFalse, throwNull)

-- | An `ObjectSet` holds a list of pattern property names;
-- it is used to indicate which properties are to be returned in the patterns
-- from `FontList`.
type ObjectSet = [String]

------
--- LowLevel
------
data ObjectSet'
type ObjectSet_ = Ptr ObjectSet'

withObjectSet :: ObjectSet -> (ObjectSet_ -> IO a) -> IO a
withObjectSet :: forall a. ObjectSet -> (ObjectSet_ -> IO a) -> IO a
withObjectSet ObjectSet
objs ObjectSet_ -> IO a
cb = forall a. (ObjectSet_ -> IO a) -> IO a
withNewObjectSet forall a b. (a -> b) -> a -> b
$ \ObjectSet_
objs' -> do
    forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM ObjectSet
objs forall a b. (a -> b) -> a -> b
$ \String
obj -> forall a. String -> (CString -> IO a) -> IO a
withCString String
obj forall a b. (a -> b) -> a -> b
$ \CString
obj' ->
        Bool -> IO ()
throwFalse forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ObjectSet_ -> CString -> IO Bool
fcObjectSetAdd ObjectSet_
objs' CString
obj'
    ObjectSet_ -> IO a
cb ObjectSet_
objs'
foreign import ccall "FcObjectSetAdd" fcObjectSetAdd ::
    ObjectSet_ -> CString -> IO Bool

withNewObjectSet :: (ObjectSet_ -> IO a) -> IO a
withNewObjectSet :: forall a. (ObjectSet_ -> IO a) -> IO a
withNewObjectSet = forall a b c. IO a -> (a -> IO b) -> (a -> IO c) -> IO c
bracket (forall a. Ptr a -> Ptr a
throwNull forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO ObjectSet_
fcObjectSetCreate) ObjectSet_ -> IO ()
fcObjectSetDestroy
foreign import ccall "FcObjectSetCreate" fcObjectSetCreate :: IO ObjectSet_
foreign import ccall "FcObjectSetDestroy" fcObjectSetDestroy :: ObjectSet_ -> IO ()