{-# options_haddock prune #-}

-- |An effect for concurrently controlling the lifecycle of a GTK main loop and accessing its resource.
module Helic.Effect.GtkMain where

-- |This effect is a communication bridge between 'Helic.Gtk' and GTK functionality effects like 'Helic.GtkClipboard'.
-- It does not directly interact with the GTK API, but allows a scope to ensure that the GTK main loop is running and to
-- access its resource (usually a display handle).
data GtkMain (s :: Type) :: Effect where
  -- |If a resource is currently available, return it.
  -- Otherwise, execute the supplied action.
  -- Should be used to bracket 'Request'.
  Access :: m s -> GtkMain s m s
  -- |Trigger the execution of the GTK main loop, then wait for its resource to be available.
  -- If it does not, execute the supplied action.
  Request :: m s -> GtkMain s m s
  -- |Bracket an action that runs the GTK main loop by clearing the resource, running the supplied action, then clearing
  -- the resource again and waiting for the next request.
  Run :: m a -> GtkMain s m a
  -- |Store the main loop resource in the state to mark the loop as running.
  Running :: s -> GtkMain s m ()

makeSem ''GtkMain