-- | Through this module, this library provides platform-independent support
-- for control character sequences following the \'ANSI\' standards (see further
-- below) for terminal software that supports those sequences, running on a
-- Unix-like operating system or Windows.
--
-- The sequences of control characters (also referred to as \'escape\' sequences
-- or codes) provide a rich range of functionality for terminal control, which
-- includes:
--
--  * Colored text output, with control over both foreground and background
--    colors
--
--  * Clearing parts of a line or the screen
--
--  * Hiding or showing the cursor
--
--  * Moving the cursor around
--
--  * Reporting the position of the cursor
--
--  * Scrolling the screen up or down
--
--  * Changing the title of the terminal
--
-- The functions moving the cursor to an absolute position are 0-based (the
-- top-left corner is considered to be at row 0 column 0) (see
-- 'setCursorPosition') and so is 'getCursorPosition0'. The \'ANSI\' standards
-- themselves are 1-based (that is, the top-left corner is considered to be at
-- row 1 column 1) and some functions reporting the position of the cursor are
-- too (see 'reportCursorPosition').
--
-- The native terminal software on Windows is \'Command Prompt\' or
-- \`PowerShell\`. Before Windows 10 version 1511 (known as the \'November
-- [2015] Update\' or \'Threshold 2\') that software did not support such
-- control sequences. For that software, this library also provides support for
-- such sequences by using emulation.
--
-- Terminal software other than the native software exists for Windows. One
-- example is the \'mintty\' terminal emulator for \'Cygwin\', \'MSYS\' or
-- \'MSYS2\', and dervied projects, and for \'WSL\' (Windows Subsystem for
-- Linux).
--
-- The \'ANSI\' standards refer to (1) standard ECMA-48 \`Control Functions for
-- Coded Character Sets\' (5th edition, 1991); (2) extensions in ITU-T
-- Recommendation (previously CCITT Recommendation) T.416 (03/93) \'Information
-- Technology – Open Document Architecture (ODA) and Interchange Format:
-- Character Content Architectures\` (also published as ISO/IEC International
-- Standard 8613-6); and (3) further extensions used by \'XTerm\', a terminal
-- emulator for the X Window System. The escape codes are described in a
-- Wikipedia article at <http://en.wikipedia.org/wiki/ANSI_escape_code> and
-- those codes supported on current versions of Windows at
-- <https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences>.
--
-- The whole of the \'ANSI\' standards are not supported by this library but
-- most (if not all) of the parts that are popular and well-supported by
-- terminal software are supported. Every function exported by this module comes
-- in three variants, namely:
--
--  * A variant that has an @IO ()@ type and doesn't take a @Handle@ (for
--    example, @clearScreen :: IO ()@). This variant just outputs the \`ANSI\`
--    command directly to the standard output channel ('stdout') and any
--    terminal corresponding to it. Commands issued like this should work as you
--    expect on both Unix-like operating systems and Windows.
--
--  * An \'@h@...\' variant that has an @IO ()@ type but takes a @Handle@ (for
--    example, @hClearScreen :: Handle -> IO ()@). This variant outputs the
--    \`ANSI\` command to the supplied handle and any terminal corresponding to
--    it. Commands issued like this should also work as you expect on both
--    Unix-like operating systems and Windows.
--
--  * A \'...@Code@\' variant that has a @String@ type (for example,
--    @clearScreenCode :: String@). This variant outputs the sequence of control
--    characters as a 'String', which can be added to any other bit of text
--    before being output. The use of these codes is generally discouraged
--    because they will not work on legacy versions of Windows where the
--    terminal in use is not ANSI-enabled (see further above). On Windows, where
--    emulation has been necessary, these variants will always output the empty
--    string. That is done so that it is possible to use them portably; for
--    example, coloring console output on the understanding that you will see
--    colors only if you are running on a Unix-like operating system or a
--    version of Windows where emulation has not been necessary. If the control
--    characters are always required, see module "System.Console.ANSI.Codes".
--
-- Example:
--
-- > module Main where
-- >
-- > import System.Console.ANSI
-- >
-- > -- Set colors and write some text in those colors.
-- > main = do
-- >   setSGR [SetColor Foreground Vivid Red]
-- >   setSGR [SetColor Background Vivid Blue]
-- >   putStrLn "Red-On-Blue"
-- >   setSGR [Reset]  -- Reset to default colour scheme
-- >   putStrLn "Default colors."
--
-- For many more examples, see the project's extensive
-- <https://github.com/feuerbach/ansi-terminal/blob/master/app/Example.hs Example.hs> file.
#if defined(WINDOWS)
module System.Console.ANSI
  (
    module System.Console.ANSI.Windows
  ) where

import System.Console.ANSI.Windows

#elif defined(UNIX)

module System.Console.ANSI
  (
    module System.Console.ANSI.Unix
  ) where

import System.Console.ANSI.Unix

#else

#error Unsupported platform for the ansi-terminal package

#endif