tricorder-0.6.0.0: src/Tricorder/Daemon/HookDispatch.hs
module Tricorder.Daemon.HookDispatch (main) where
import Atelier.Effects.FileWatcher (FileEvent (..))
import Atelier.Effects.Process (Process)
import Atelier.Effects.PubSub.Sub (Sub)
import Effectful.Reader.Static (Reader)
import Atelier.Effects.PubSub.Sub qualified as Sub
import System.FilePath qualified as Path
import Tricorder.Daemon.Watch (WatchedFile (..))
import Tricorder.Runtime (ProjectRoot)
import Tricorder.Session (Session (..))
import Tricorder.Session.HaskellHooks (HaskellHooks (..))
import Tricorder.Session.Hooks (Hooks (..))
import Tricorder.Session.Hook qualified as Hook
main :: (Process :> es, Reader ProjectRoot :> es, Sub WatchedFile :> es) => Session -> Eff es Void
main session =
Sub.listen_ \case
(WatchedFile path event)
| Path.takeExtension path == "hs"
, Just hooks <- session.hooks.haskell ->
runHsHook hooks event
| otherwise -> pure ()
runHsHook :: (Process :> es, Reader ProjectRoot :> es) => HaskellHooks -> FileEvent -> Eff es ()
runHsHook hooks = \case
Added -> whenJust hooks.fileAdded Hook.run
Modified -> whenJust hooks.fileModified Hook.run
Removed -> whenJust hooks.fileRemoved Hook.run