{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE InstanceSigs #-}

-- | Statistics on diffs
module Filediff.Stats
( -- * basic stats
  numFilesAffected
, numAddedLines
, numDeletedLines
) where

import Filediff.Types
import Filediff.Sequence

-- | Number of files added, modified, or deleted in a diff.
numFilesAffected :: Diff -> Int
numFilesAffected = length . filediffs

numMatchingLines :: (FileChange -> Bool) -> (SeqDiff Line -> [b]) -> Diff -> Int
numMatchingLines isMatchingChange matchingLines
    = sum
    . map (length . matchingLines . seqDiff)
    . filter isMatchingChange
    . map change
    . filediffs

-- | Number of lines added in a diff.
numAddedLines :: Diff -> Int
numAddedLines = numMatchingLines (not . isDel) adds

-- | Number of lines deleted in a diff.
numDeletedLines :: Diff -> Int
numDeletedLines = numMatchingLines (not . isAdd) dels