content: module Unused.Grouping
      ( Grouping(..)
      , CurrentGrouping(..)
      , GroupedTerms
      , groupedResponses
      ) where
  
  import qualified Data.List as L
  import qualified Data.Map.Strict as Map
  import           Unused.Grouping.Internal (groupFilter)
  import           Unused.Grouping.Types (Grouping(..), CurrentGrouping(..), GroupFilter, GroupedTerms)
  import           Unused.ResponseFilter (updateMatches)
  import           Unused.Types (TermMatchSet, TermResults(trMatches))
  
  groupedResponses :: CurrentGrouping -> TermMatchSet -> [GroupedTerms]
  groupedResponses g tms =
      (\g' -> (g', groupedMatchSetSubsets currentGroup g' tms)) <$> groupingsFromSet
    where
      groupingsFromSet = allGroupings currentGroup tms
      currentGroup = groupFilter g
  
  groupedMatchSetSubsets :: GroupFilter -> Grouping -> TermMatchSet -> TermMatchSet
  groupedMatchSetSubsets f tms =
      updateMatches $ filter ((== tms) . f)
  
  allGroupings :: GroupFilter -> TermMatchSet -> [Grouping]
  allGroupings f =
      uniqueValues . Map.map (fmap f . trMatches)
    where
      uniqueValues = L.sort . L.nub . concat . Map.elems
  