module Unused.Grouping
    ( Grouping(..)
    , CurrentGrouping(..)
    , GroupedTerms
    , groupedResponses
    ) where

import qualified Data.Map.Strict as Map
import Data.List (sort, nub)
import Unused.Types
import Unused.ResponseFilter (updateMatches)
import Unused.Grouping.Types
import Unused.Grouping.Internal

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 newMatches
  where
    newMatches = filter ((== tms) . f)

allGroupings :: GroupFilter -> TermMatchSet -> [Grouping]
allGroupings f =
    uniqueValues . Map.map (fmap f . trMatches)
  where
    uniqueValues = sort . nub . concat . Map.elems