packages feed

gi-gio-hs-list-model-0.1.0.0: src/Data/GI/Gio/ListModel/CustomStoreItem.hs

{-# LANGUAGE CPP #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}

module Data.GI.Gio.ListModel.CustomStoreItem
  ( CustomStoreItem (..),
    customStoreItemGetItem,
    fromObject,
  )
where

import Control.Monad.IO.Class (MonadIO (liftIO))
import Data.GI.Base (castTo, withManagedPtr)
import Data.GI.Base.BasicTypes
import Data.GI.Base.Overloading (HasParentTypes, ParentTypes)
import Data.GI.Gio.ListModel.Internal.ListItemCImports
import Foreign (Ptr, StablePtr, deRefStablePtr)
import GI.GObject (Object)

foreign import ccall "GiGioHsListItem.h gi_gio_hs_list_item_get_item"
  giGioHsListItemGetItem :: Ptr (CustomStoreItem a) -> IO (StablePtr a)

-- | The 'Object' returned by 'GI.Gtk.Objects.ListItem.listItemGetItem' can be
-- cast into tihs type. 'fromObject' can be used for convinience.
newtype CustomStoreItem a = CustomStoreItem (ManagedPtr (CustomStoreItem a))

instance HasParentTypes (CustomStoreItem a)

type instance ParentTypes (CustomStoreItem a) = '[Object]

instance TypedObject (CustomStoreItem a) where
  glibType = GType <$> listItemGetType

instance GObject (CustomStoreItem a)

customStoreItemGetItem :: MonadIO m => CustomStoreItem a -> m a
customStoreItemGetItem item =
  liftIO $ withManagedPtr item giGioHsListItemGetItem >>= deRefStablePtr

fromObject :: forall a m. MonadIO m => Object -> m (Maybe a)
fromObject obj = liftIO $ do
  mStoreItem :: Maybe (CustomStoreItem a) <- castTo CustomStoreItem obj
  traverse customStoreItemGetItem mStoreItem