content: {-
    Gifcurry
    (C) 2017 David Lettier
    lettier.com
  
    Based on the following works.
  
      - https://github.com/gtk2hs/gtk2hs/blob/master/gtk/Graphics/UI/Gtk/General/General.chs#L177
      - https://github.com/gtk2hs/gtk2hs/blob/master/gtk/Graphics/UI/Gtk/General/General.chs#L188
  
    Modified to work with haskell-gi (https://github.com/haskell-gi).
  
    Original license:
  
    GIMP Toolkit (GTK) General
  
    Author : Axel Simon, Manuel M. T. Chakravarty
  
    Created: 8 December 1998
  
    Copyright (C) 2000..2005 Axel Simon, Manuel M. T. Chakravarty
  
    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2.1 of the License, or (at your option) any later version.
  
    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Lesser General Public License for more details.
  -}
  
  {-# LANGUAGE OverloadedStrings #-}
  
  module GtkMainSyncAsync
    ( gtkMainSync
    , gtkMainAsync
    )
    where
  
  import Control.Monad
  import Control.Concurrent
  import GI.GLib hiding (String, IOError)
  
  gtkMainSync :: IO a -> IO a
  gtkMainSync callback =
    newEmptyMVar >>=
    gtkMainSyncSetupCallBack callback >>=
    takeMVar
  
  gtkMainAsync :: IO () -> IO ()
  gtkMainAsync callback = gtkMainAddCallback (callback >> return False)
  
  gtkMainSyncSetupCallBack :: IO a -> MVar a -> IO (MVar a)
  gtkMainSyncSetupCallBack callback mVar =
    gtkMainAddCallback (gtkMainSyncBuildCallBack callback mVar) >> return mVar
  
  gtkMainSyncBuildCallBack :: IO a -> MVar a -> IO Bool
  gtkMainSyncBuildCallBack callback mVar = callback >>= putMVar mVar >> return False
  
  gtkMainAddCallback :: GI.GLib.SourceFunc -> IO ()
  gtkMainAddCallback callback =
    void $ GI.GLib.idleAdd GI.GLib.PRIORITY_DEFAULT callback
  