content: module Actions
    ( act
    ) where
  
  import Language.Haskell.Format
  import Language.Haskell.Format.Utilities
  import Options
  import Types
  
  import Control.Monad
  
  act :: Options -> Formatted -> IO Formatted
  act options r@(Formatted input source result) = act' (optAction options)
    where
      act' PrintDiffs =
        when wasReformatted' (printDiff input source result) >> return r
      act' PrintSources = do
        when wasReformatted' (printSource $ reformattedSource result)
        return (Formatted input (reformattedSource result) result)
      act' PrintFilePaths = when wasReformatted' (print input) >> return r
      act' WriteSources = do
        when wasReformatted' (writeSource input (reformattedSource result))
        return (Formatted input (reformattedSource result) result)
      wasReformatted' = wasReformatted source result
  
  printDiff :: SourceFile -> HaskellSource -> Reformatted -> IO ()
  printDiff (SourceFilePath path) source reformatted = do
    putStrLn (path ++ ":")
    mapM_ (putStr . show) (suggestions reformatted)
    putStr (showDiff source (reformattedSource reformatted))
  printDiff StdinSource source reformatted = do
    mapM_ (putStr . show) (suggestions reformatted)
    putStr (showDiff source (reformattedSource reformatted))
  
  printSource :: HaskellSource -> IO ()
  printSource (HaskellSource _ source) = putStr source
  
  writeSource :: SourceFile -> HaskellSource -> IO ()
  writeSource (SourceFilePath path) (HaskellSource _ source) =
    writeFile path source
  writeSource StdinSource (HaskellSource _ source) = putStr source
  