pretty-simple-0.2.0.0: src/Text/Pretty/Simple/Internal/Output.hs
{-# LANGUAGE CPP #-}
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE InstanceSigs #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
{-|
Module : Text.Pretty.Simple.Internal.Output
Copyright : (c) Dennis Gosnell, 2016
License : BSD-style (see LICENSE file)
Maintainer : cdep.illabout@gmail.com
Stability : experimental
Portability : POSIX
-}
module Text.Pretty.Simple.Internal.Output
where
#if __GLASGOW_HASKELL__ < 710
-- We don't need this import for GHC 7.10 as it exports all required functions
-- from Prelude
import Control.Applicative
#endif
import Control.Lens.TH (makeLenses)
import Data.Data (Data)
import Data.String (IsString, fromString)
import Data.Typeable (Typeable)
import GHC.Generics (Generic)
-- | Datatype representing how much something is nested.
--
-- For example, a 'NestLevel' of 0 would mean an 'Output' token
-- is at the very highest level, not in any braces.
--
-- A 'NestLevel' of 1 would mean that an 'Output' token is in one single pair
-- of @\{@ and @\}@, or @\[@ and @\], or @\(@ and @\)@.
--
-- A 'NestLevel' of 2 would mean that an 'Output' token is two levels of
-- brackets, etc.
newtype NestLevel = NestLevel { _unNestLevel :: Int }
deriving (Data, Eq, Generic, Num, Ord, Read, Show, Typeable)
makeLenses ''NestLevel
-- | These are the output tokens that we will be printing to the screen.
data OutputType
= OutputCloseBrace
-- ^ This represents the @\}@ character.
| OutputCloseBracket
-- ^ This represents the @\]@ character.
| OutputCloseParen
-- ^ This represents the @\)@ character.
| OutputComma
-- ^ This represents the @\,@ character.
| OutputIndent
-- ^ This represents an indentation.
| OutputNewLine
-- ^ This represents the @\\n@ character.
| OutputOpenBrace
-- ^ This represents the @\{@ character.
| OutputOpenBracket
-- ^ This represents the @\[@ character.
| OutputOpenParen
-- ^ This represents the @\(@ character.
| OutputOther !String
-- ^ This represents some collection of characters that don\'t fit into any
-- of the other tokens.
| OutputStringLit !String
-- ^ This represents a string literal. For instance, @\"foobar\"@.
deriving (Data, Eq, Generic, Read, Show, Typeable)
-- | 'IsString' (and 'fromString') should generally only be used in tests and
-- debugging. There is no way to represent 'OutputIndent' and
-- 'OutputStringLit'.
instance IsString OutputType where
fromString :: String -> OutputType
fromString "}" = OutputCloseBrace
fromString "]" = OutputCloseBracket
fromString ")" = OutputCloseParen
fromString "," = OutputComma
fromString "\n" = OutputNewLine
fromString "{" = OutputOpenBrace
fromString "[" = OutputOpenBracket
fromString "(" = OutputOpenParen
fromString string = OutputOther string
-- | An 'OutputType' token together with a 'NestLevel'. Basically, each
-- 'OutputType' keeps track of its own 'NestLevel'.
data Output = Output
{ outputNestLevel :: NestLevel
, outputOutputType :: OutputType
} deriving (Data, Eq, Generic, Read, Show, Typeable)