module Language.Haskell.Format.HLint
  ( autoSettings
  , suggester
  ) where

import Language.Haskell.Format.Internal
import Language.Haskell.Format.Types

import Language.Haskell.HLint           (Classify, Hint, Idea, ParseError (..),
                                         ParseFlags, applyHints, argsSettings,
                                         parseModuleEx)
import System.IO.Unsafe                 (unsafePerformIO)

suggester :: (ParseFlags, [Classify], Hint) -> Formatter
suggester :: (ParseFlags, [Classify], Hint) -> Formatter
suggester = (HaskellSource -> Either String [Suggestion]) -> Formatter
mkSuggester ((HaskellSource -> Either String [Suggestion]) -> Formatter)
-> ((ParseFlags, [Classify], Hint)
    -> HaskellSource -> Either String [Suggestion])
-> (ParseFlags, [Classify], Hint)
-> Formatter
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ParseFlags, [Classify], Hint)
-> HaskellSource -> Either String [Suggestion]
hlint

hlint ::
     (ParseFlags, [Classify], Hint)
  -> HaskellSource
  -> Either String [Suggestion]
hlint :: (ParseFlags, [Classify], Hint)
-> HaskellSource -> Either String [Suggestion]
hlint (ParseFlags
flags, [Classify]
classify, Hint
hint) (HaskellSource String
filepath String
source) =
  case IO (Either ParseError ModuleEx) -> Either ParseError ModuleEx
forall a. IO a -> a
unsafePerformIO (ParseFlags
-> String -> Maybe String -> IO (Either ParseError ModuleEx)
parseModuleEx ParseFlags
flags String
filepath (String -> Maybe String
forall a. a -> Maybe a
Just String
source)) of
    Right ModuleEx
m         -> [Suggestion] -> Either String [Suggestion]
forall a b. b -> Either a b
Right ([Suggestion] -> Either String [Suggestion])
-> (ModuleEx -> [Suggestion])
-> ModuleEx
-> Either String [Suggestion]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Idea -> Suggestion) -> [Idea] -> [Suggestion]
forall a b. (a -> b) -> [a] -> [b]
map Idea -> Suggestion
ideaToSuggestion ([Idea] -> [Suggestion])
-> (ModuleEx -> [Idea]) -> ModuleEx -> [Suggestion]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ModuleEx -> [Idea]
ideas (ModuleEx -> Either String [Suggestion])
-> ModuleEx -> Either String [Suggestion]
forall a b. (a -> b) -> a -> b
$ ModuleEx
m
    Left ParseError
parseError -> String -> Either String [Suggestion]
forall a b. a -> Either a b
Left (String -> Either String [Suggestion])
-> (ParseError -> String)
-> ParseError
-> Either String [Suggestion]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParseError -> String
parseErrorMessage (ParseError -> Either String [Suggestion])
-> ParseError -> Either String [Suggestion]
forall a b. (a -> b) -> a -> b
$ ParseError
parseError
  where
    ideas :: ModuleEx -> [Idea]
ideas ModuleEx
m = [Classify] -> Hint -> [ModuleEx] -> [Idea]
applyHints [Classify]
classify Hint
hint [ModuleEx
m]

autoSettings :: IO (ParseFlags, [Classify], Hint)
autoSettings :: IO (ParseFlags, [Classify], Hint)
autoSettings = [String] -> IO (ParseFlags, [Classify], Hint)
argsSettings []

ideaToSuggestion :: Idea -> Suggestion
ideaToSuggestion :: Idea -> Suggestion
ideaToSuggestion = String -> Suggestion
Suggestion (String -> Suggestion) -> (Idea -> String) -> Idea -> Suggestion
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Idea -> String
forall a. Show a => a -> String
show