packages feed

hbro-1.2.0.0: library/Hbro/WebView/Hooks.hs

{-# LANGUAGE TemplateHaskell #-}
module Hbro.WebView.Hooks (
-- * Types
      DownloadHook(..)
    , LinkClickedHook(..)
    , LoadRequestedHook(..)
    , NewWindowHook(..)
    , ResourceOpenedHook(..)
    , TitleChangedHook(..)
    , Hooks
    , onDownloadL
    , onLinkClickedL
    , onLinkHoveredL
    , onLoadRequestedL
    , onLoadStartedL
    , onLoadFinishedL
    , onNewWindowL
    , onResourceOpenedL
    , onTitleChangedL
    , HasHooks(..)
-- * Functions
    , set
    , initHooks
) where

-- {{{ Imports
import Hbro.Prelude
import Hbro.WebView.Signals

import Control.Lens.Lens
import Control.Lens.Setter hiding(set)
import Control.Lens.TH
import Control.Monad.Reader
-- }}}


newtype DownloadHook m       = DownloadHook (Download -> m ())
newtype LinkClickedHook m    = LinkClickedHook (LinkClicked -> m ())
newtype LoadRequestedHook m  = LoadRequestedHook (LoadRequested -> m ())
newtype NewWindowHook m      = NewWindowHook (NewWindow -> m ())
newtype ResourceOpenedHook m = ResourceOpenedHook (ResourceOpened -> m ResourceAction)
newtype TitleChangedHook m   = TitleChangedHook (TitleChanged -> m ())


data Hooks m = Hooks
    { _onDownload       :: TMVar (Download -> m ())
    , _onLinkClicked    :: TMVar (LinkClicked -> m ())
    , _onLinkHovered    :: TMVar (LinkHovered -> m ())
    , _onLoadRequested  :: TMVar (LoadRequested -> m ())
    , _onLoadStarted    :: TMVar (LoadStarted -> m ())
    , _onLoadFinished   :: TMVar (LoadFinished -> m ())
    , _onNewWindow      :: TMVar (NewWindow -> m ())
    , _onResourceOpened :: TMVar (ResourceOpened -> m ())
    , _onTitleChanged   :: TMVar (TitleChanged -> m ())
    }

makeLensesWith ?? ''Hooks $ lensRules
    & lensField .~ (\name -> Just (tail name ++ "L"))
    -- & lensClass .~ (\name -> Just ("Has" ++ name, map toLower name))

class HasHooks n t | t -> n where _hooks :: Lens' t (Hooks n)

set :: (BaseIO m, MonadReader r m, HasHooks n r) => Lens' (Hooks n) (TMVar a) -> a -> m ()
set l v = atomically . (`writeTMVar` v) =<< askL (_hooks.l)


initHooks :: (Functor n, BaseIO m, Default (LinkClickedHook n), Default (LoadRequestedHook n), Default (NewWindowHook n), Default (ResourceOpenedHook n), Default (TitleChangedHook n))
          => m (Hooks n)
initHooks = io (Hooks <$> newEmptyTMVarIO
                      <*> newTMVarIO lc
                      <*> newEmptyTMVarIO
                      <*> newTMVarIO lr
                      <*> newEmptyTMVarIO
                      <*> newEmptyTMVarIO
                      <*> newTMVarIO nw
                      <*> newTMVarIO (void . ro)
                      <*> newTMVarIO tc)
  where
      LinkClickedHook    lc = def
      LoadRequestedHook  lr = def
      NewWindowHook      nw = def
      ResourceOpenedHook ro = def
      TitleChangedHook   tc = def