packages feed

reflex-gi-gtk-0.1.0.0: src/Reflex/GI/Gtk/Run/Class.hs

-- This Source Code Form is subject to the terms of the Mozilla Public
-- License, v. 2.0. If a copy of the MPL was not distributed with this
-- file, You can obtain one at https://mozilla.org/MPL/2.0/.

{-# LANGUAGE TypeApplications, DefaultSignatures, StandaloneDeriving #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}

module Reflex.GI.Gtk.Run.Class
  ( MonadRunGtk( askRunGtk_
               , askRunGtk
               , askRunGtkPromise
               , askMakeSynchronousFire
               )
  , runGtk_
  , runGtk
  , runGtkPromise
  ) where

import Control.Monad (join)
import Control.Monad.IO.Class ( MonadIO
                              , liftIO
                              )
import Control.Monad.Reader (ReaderT(ReaderT))
import Control.Monad.Trans (lift)
import Reflex ( PostBuildT(PostBuildT)
              , TriggerEventT(TriggerEventT)
              )

class (MonadIO m) => MonadRunGtk m where
  askRunGtk :: m (IO a -> IO a)
  askRunGtk = (join .) <$> askRunGtkPromise

  askRunGtk_ :: m (IO a -> IO ())

  askRunGtkPromise :: m (IO a -> IO (IO a))

  askMakeSynchronousFire :: m ((a -> IO () -> IO ()) -> a -> IO ())

deriving instance MonadRunGtk m => MonadRunGtk (PostBuildT t m)
deriving instance MonadRunGtk m => MonadRunGtk (TriggerEventT t m)

instance MonadRunGtk m => MonadRunGtk (ReaderT r m) where
  askRunGtk = lift askRunGtk
  askRunGtk_ = lift askRunGtk_
  askRunGtkPromise = lift askRunGtkPromise
  askMakeSynchronousFire = lift askMakeSynchronousFire

runGtk :: (MonadRunGtk m) => IO a -> m a
runGtk a = askRunGtk >>= liftIO . ($a)

runGtk_ :: (MonadRunGtk m) => IO a -> m ()
runGtk_ a = askRunGtk_ >>= liftIO . ($a)

runGtkPromise :: (MonadRunGtk m) => IO a -> m (m a)
runGtkPromise a = askRunGtkPromise >>= liftIO . fmap liftIO . ($a)