packages feed

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