    -- | This module provides the input abstraction for Vty.
    module Graphics.Vty.Input
      ( Input(..)
      , module Graphics.Vty.Input.Events
      )
    where

    import Graphics.Vty.Input.Events
    import Control.Concurrent.STM (TChan)

    -- | The library's input-processing abstraction. Platform-specific
    -- implementations must implement an 'Input' and provide it to
    -- 'Graphics.Vty.mkVtyFromPair'.
    data Input =
        Input { Input -> TChan InternalEvent
    eventChannel :: TChan InternalEvent
              -- ^ A channel of events generated by input processing. The
              -- input implementation must write its input events to this
              -- channel; the Vty event loop will read from this channel
              -- and provide the events to the user's application via
              -- 'nextEvent'.
              , Input -> IO ()
    shutdownInput :: IO ()
              -- ^ Shut down the input processing. As part of shutting down
              -- the input, this should also restore the input state if
              -- appropriate.
              , Input -> IO ()
    restoreInputState :: IO ()
              -- ^ Restore the terminal's input state to what it was prior
              -- to configuring the input for Vty. This should be done as
              -- part of 'shutdownInput' but is exposed in case it needs to
              -- be used directly.
              , Input -> String -> IO ()
    inputLogMsg :: String -> IO ()
              -- ^ Log the specified message.
              }