module Argon.Results (order, filterResults, filterNulls, exportStream)
where
import Data.Ord (comparing)
import Data.List (sortBy)
import Data.String (IsString)
import qualified Data.ByteString.Lazy as B
#if __GLASGOW_HASKELL__ < 710
import Control.Applicative ((<*), (*>))
#endif
import Data.Aeson (encode)
import Pipes
import Pipes.Group
import qualified Pipes.Prelude as P
import Lens.Simple ((^.))
import Argon.Formatters
import Argon.Types
sortOn :: Ord b => (a -> b) -> [a] -> [a]
sortOn f =
map snd . sortBy (comparing fst) . map (\x -> let y = f x in y `seq` (y, x))
order :: [ComplexityBlock] -> [ComplexityBlock]
order = sortOn (\(CC ((l, _), f, cc)) -> (cc, l, f))
filterNulls :: (FilePath, AnalysisResult) -> Bool
filterNulls (_, r) = case r of
Left _ -> True
Right [] -> False
_ -> True
filterResults :: Config
-> (FilePath, AnalysisResult)
-> (FilePath, AnalysisResult)
filterResults _ (s, Left err) = (s, Left err)
filterResults o (s, Right rs) =
(s, Right $ order [r | r@(CC (_, _, cc)) <- rs, cc >= minCC o])
exportStream :: Config
-> Producer (FilePath, AnalysisResult) IO ()
-> Effect IO ()
exportStream conf source =
case outputMode conf of
BareText -> source >-> bareTextFormatter >-> P.stdoutLn
Colored -> source >-> coloredTextFormatter >-> P.stdoutLn
JSON -> jsonStream (source >-> P.map encode) >-> P.mapM_ B.putStr
jsonStream :: IsString a
=> Producer a IO ()
-> Producer a IO ()
jsonStream source = yield "[" *> intersperse' "," source <* yield "]\n"
intersperse' :: Monad m => a -> Producer a m r -> Producer a m r
intersperse' a producer = intercalates (yield a) (producer ^. chunksOf 1)