@@ -12,44 +12,37 @@
12-- File watcher for externs files
12-- File watcher for externs files
13-----------------------------------------------------------------------------
13-----------------------------------------------------------------------------
15−{-# LANGUAGE RecordWildCards #-}
17module Language.PureScript.Ide.Watcher where
15module Language.PureScript.Ide.Watcher where
22import Control.Concurrent (threadDelay)
17import Control.Concurrent (threadDelay)
23import Control.Concurrent.STM
18import Control.Concurrent.STM
24import Control.Monad
19import Control.Monad
25import Control.Monad.Trans.Except
20import Control.Monad.Trans.Except
26−import qualified Data.Map as M
27−import Data.Maybe (isJust)
28−import Language.PureScript.Externs
29import Language.PureScript.Ide.Externs
21import Language.PureScript.Ide.Externs
30import Language.PureScript.Ide.State
22import Language.PureScript.Ide.State
31import Language.PureScript.Ide.Types
23import Language.PureScript.Ide.Types
32import System.FilePath
25import System.FilePath
33import System.FSNotify
26import System.FSNotify
28+-- | Reloads an ExternsFile from Disc. If the Event indicates the ExternsFile
29+-- was deleted we don't do anything.
30+reloadFile :: TVar PscIdeState -> Event -> IO ()
31+reloadFile _ Removed{} = pure ()
32+reloadFile stateVar ev = do
33+ let fp = eventPath ev
34+ ef' <- runExceptT (readExternFile fp)
38+ atomically (insertModule' stateVar ef)
39+ putStrLn ("Reloaded File at: " ++ fp)
36−reloadFile :: TVar PscIdeState -> FilePath -> IO ()
41+-- | Installs filewatchers for the given directory and reloads ExternsFiles when
37−reloadFile stateVar fp = do
42+-- they change on disc
38− (Right ef@ExternsFile{..}) <- runExceptT $ readExternFile fp
39− reloaded <- atomically $ do
40− st <- readTVar stateVar
41− if isLoaded efModuleName st
43− insertModule' stateVar ef *> pure True
46− when reloaded $ putStrLn $ "Reloaded File at: " ++ fp
48− isLoaded name st = isJust (M.lookup name (externsFiles st))
50watcher :: TVar PscIdeState -> FilePath -> IO ()
43watcher :: TVar PscIdeState -> FilePath -> IO ()
51−watcher stateVar fp = withManager $ \mgr -> do
44+watcher stateVar fp = withManagerConf (defaultConfig { confDebounce = NoDebounce }) $ \mgr -> do
52 _ <- watchTree mgr fp
45 _ <- watchTree mgr fp
53 (\ev -> takeFileName (eventPath ev) == "externs.json")
46 (\ev -> takeFileName (eventPath ev) == "externs.json")
54− (reloadFile stateVar . eventPath)
47+ (reloadFile stateVar)
55− forever (threadDelay 10000)
48+ forever (threadDelay 100000)