content: module Types
    ( Action(..)
    , FormatResult
    , FormatError(..)
    , Formatted(..)
    , HaskellSource(..)
    , RunResult(..)
    , SourceFile(..)
    , SourceFileWithContents(..)
    ) where
  
  import Data.Semigroup          (Semigroup, (<>))
  import Language.Haskell.Format
  
  data Action
    = PrintDiffs
    | PrintSources
    | PrintFilePaths
    | WriteSources
    deriving (Eq)
  
  data SourceFile
    = SourceFilePath FilePath
    | StdinSource
  
  instance Show SourceFile where
    show (SourceFilePath path) = path
    show StdinSource           = "-"
  
  data SourceFileWithContents =
    SourceFileWithContents SourceFile HaskellSource
  
  type FormatResult = Either FormatError Formatted
  
  data FormatError =
    FormatError SourceFile String
  
  instance Show FormatError where
    show (FormatError input errorString) =
      "Error reformatting " ++ show input ++ ": " ++ errorString
  
  data Formatted =
    Formatted SourceFile HaskellSource Reformatted
  
  data RunResult
    = OperationalFailure
    | SourceParseFailure
    | HadDifferences
    | NoDifferences
  
  instance Semigroup RunResult where
    x <> NoDifferences      = x
    NoDifferences <> x      = x
    OperationalFailure <> _ = OperationalFailure
    SourceParseFailure <> _ = SourceParseFailure
    HadDifferences <> _     = HadDifferences
  
  instance Monoid RunResult where
    mempty = NoDifferences
    mappend = (<>)
  