content: {-# LANGUAGE DefaultSignatures      #-}
  {-# LANGUAGE DeriveFunctor          #-}
  {-# LANGUAGE FunctionalDependencies #-}
  {-# LANGUAGE TypeFamilies           #-}
  
  -- | Shared interfaces for containers.
  module GI.Gtk.Declarative.Container.Class where
  
  import           Data.Int                       ( Int32 )
  import           Data.Vector                    ( Vector )
  import qualified GI.Gtk                        as Gtk
  
  -- | Describes supported GTK+ containers and their specialized APIs for
  -- appending and replacing child widgets.
  class IsContainer container child | container -> child where
    -- | Append a child widget to the container.
    appendChild
      :: container    -- ^ Container widget
      -> child event  -- ^ Declarative child widget
      -> Gtk.Widget   -- ^ GTK child widget to append
      -> IO ()
    -- | Replace the child widget at the given index in the container.
    replaceChild
      :: container    -- ^ Container widget
      -> child event  -- ^ Declarative child widget
      -> Int32        -- ^ Index to replace at
      -> Gtk.Widget   -- ^ Old GTK widget to replace
      -> Gtk.Widget   -- ^ New GTK widget to replace with
      -> IO ()
  
  -- | Common collection type for child widgets, used when patching containers.
  newtype Children child event = Children { unChildren :: Vector (child event) }
    deriving (Functor)
  
  -- | Converts a specific collection type to 'Children'.
  class ToChildren widget parent child | widget -> parent, widget -> child where
    toChildren :: (Gtk.ManagedPtr widget -> widget) -> parent (child event) -> Children child event
  
    default toChildren :: parent ~ Vector => (Gtk.ManagedPtr widget -> widget) -> parent (child event) -> Children child event
    toChildren _ = Children
  