packages feed

ghcide-1.8.0.0: src/Development/IDE/Core/FileUtils.hs

{-# LANGUAGE CPP #-}

module Development.IDE.Core.FileUtils(
    getModTime,
    ) where


import           Data.Time.Clock.POSIX
#ifdef mingw32_HOST_OS
import qualified System.Directory      as Dir
#else
import           System.Posix.Files    (getFileStatus, modificationTimeHiRes)
#endif

-- Dir.getModificationTime is surprisingly slow since it performs
-- a ton of conversions. Since we do not actually care about
-- the format of the time, we can get away with something cheaper.
-- For now, we only try to do this on Unix systems where it seems to get the
-- time spent checking file modifications (which happens on every change)
-- from > 0.5s to ~0.15s.
-- We might also want to try speeding this up on Windows at some point.
-- TODO leverage DidChangeWatchedFile lsp notifications on clients that
-- support them, as done for GetFileExists
getModTime :: FilePath -> IO POSIXTime
getModTime f =
#ifdef mingw32_HOST_OS
    utcTimeToPOSIXSeconds <$> Dir.getModificationTime f
#else
    modificationTimeHiRes <$> getFileStatus f
#endif