module System.FSWatch.Repr where


import Control.Concurrent (MVar, Chan)

import System.FSNotify (WatchManager)
import System.IO (IO, Handle)
import System.Process (ProcessHandle)

data WatchProcess = WatchProcess
  { wPath :: String
  , wProcessHandle :: ProcessHandle
  , wStdin :: Handle
  , wStdout :: Handle
  , wNotifyMVar :: MVar [PE]
  , wShutdown :: IO ()
  }

type Listener = PE -> IO ()

data Opts = Opts
  { oSlave :: Bool
  , oFixBufferMode :: Int
  , oDelayedBufferMode :: Int
  }

data State = State
  { prompt :: MVar String
  , printFormat :: MVar PrintFormat
  , buffering :: MVar NotifyBuffering
  , mode :: MVar Mode
  }


data DBE = DBE
  { wman :: WatchManager
  , wfn :: String
  }

type DB = [DBE]
type P = (IO (), Chan PE)


data PE
  = Mod String
  | Add String
  | Rem String
  | Prt { fromPrt :: String }
  deriving (Eq, Show, Read)

isPrt :: PE -> Bool
isPrt (Prt _) = True
isPrt _ = False

data PrintFormat
  = MultiRecord
  | SingleRecord
  deriving (Eq, Show)

data Mode
  = CLI
  | SLAVE
  deriving (Eq, Show)

data NotifyBuffering
  = NoNotifyBuffer
  | FixTimeBuffer Int
  | DelayedBuffer Int
  deriving (Eq, Show)