packages feed

hfsevents-0.1.3: test/trace.hs

{-
   simple event tracer that monitors the current
   directory and prints all events
-}

import System.OSX.FSEvents

import Data.Bits
import Data.List (unwords)
import Data.Word

main = do
  es <- eventStreamCreate ["."] 1.0 True True True trace
  getLine
  eventStreamDestroy es
  return ()

trace :: Event -> IO ()
trace e = do
  putStrLn $ "id:    " ++ show (eventId e)
  putStrLn $ "path:  " ++ eventPath e
  putStrLn $ "flags: " ++ showEventFlags (eventFlags e)
  putStrLn ""

showEventFlags :: Word64 -> String
showEventFlags fl = unwords (map fst . filter hasFlag $ flagList)
  where
    hasFlag (_,f) = fl .&. f /= 0

-- fixme come up with some better way to make this list
flagList :: [(String, Word64)]
flagList = [ ("MustScanSubDirs"   , 0x00000001)
           , ("UserDropped"       , 0x00000002)
           , ("KernelDropped"     , 0x00000004)
           , ("EventIdsWrapped"   , 0x00000008)
           , ("HistoryDone"       , 0x00000010)
           , ("RootChanged"       , 0x00000020)
           , ("Mount"             , 0x00000040)
           , ("Unmount"           , 0x00000080)
           , ("ItemCreated"       , 0x00000100)
           , ("ItemRemoved"       , 0x00000200)
           , ("ItemInodeMetaMod"  , 0x00000400)
           , ("ItemRenamed"       , 0x00000800)
           , ("ItemModified"      , 0x00001000)
           , ("ItemFinderInfoMod" , 0x00002000)
           , ("ItemChangeOwner"   , 0x00004000)
           , ("ItemXattrMod"      , 0x00008000)
           , ("ItemIsFile"        , 0x00010000)
           , ("ItemIsDir"         , 0x00020000)
           , ("ItemIsSymlink"     , 0x00040000)
           ]