    module System.Console.Haskeline.Backend where

    import System.Console.Haskeline.Term
    import System.Console.Haskeline.Monads
    import Control.Monad
    import System.IO (stdin, hGetEcho, Handle)

    #ifdef MINGW
    import System.Console.Haskeline.Backend.Win32 as Win32
    #else
    import System.Console.Haskeline.Backend.Posix as Posix
    #ifdef TERMINFO
    import System.Console.Haskeline.Backend.Terminfo as Terminfo
    #endif
    import System.Console.Haskeline.Backend.DumbTerm as DumbTerm
    #endif

    defaultRunTerm :: IO RunTerm
    defaultRunTerm = (liftIO (hGetEcho stdin) >>= guard >> stdinTTY)
                        `orElse` fileHandleRunTerm stdin

    terminalRunTerm :: IO RunTerm
    terminalRunTerm = directTTY `orElse` fileHandleRunTerm stdin

    stdinTTY :: MaybeT IO RunTerm
    #ifdef MINGW
    stdinTTY = win32TermStdin
    #else
    stdinTTY = stdinTTYHandles >>= runDraw
    #endif

    directTTY :: MaybeT IO RunTerm
    #ifdef MINGW
    directTTY = win32Term
    #else
    directTTY = ttyHandles >>= runDraw
    #endif

    #ifndef MINGW
    runDraw :: Handles -> MaybeT IO RunTerm
    #ifndef TERMINFO
    runDraw = runDumbTerm
    #else
    runDraw h = runTerminfoDraw h `mplus` runDumbTerm h
    #endif
    #endif

    fileHandleRunTerm :: Handle -> IO RunTerm
    #ifdef MINGW
    fileHandleRunTerm = Win32.fileRunTerm
    #else
    fileHandleRunTerm = Posix.fileRunTerm
    #endif