module NLP.PStemmer.Internal.Function (
  module PST,
  module NLP.PStemmer.Internal.Function,
  fromMaybe,
  first, second, (***), (&&&)) where

  import qualified Data.Text as T
  import qualified Data.List as DL
  import qualified Data.Ord as DO
  import Data.Maybe (fromMaybe)
  import NLP.PStemmer.Types as PST
  import Control.Arrow (second, first, (***), (&&&))

  applySteps :: T.Text -> [Step] -> T.Text
  applySteps rv [] = rv
  applySteps rv (f:fs) =
    let
      r :: T.Text
      r = f rv
    in
      if T.null r
        then r
        else applySteps r fs

  cutList :: List -> Substep
  cutList (w:ws) txt =
    if w `T.isSuffixOf` txt
      then fromMaybe (txt, False) (flip (,) True <$> T.stripSuffix w txt)
      else cutList ws txt
  cutList _ txt = (txt, False)

  getFirstSR :: [Substep] -> T.Text -> T.Text
  getFirstSR [] txt = txt
  getFirstSR (f:fs) txt =
    let
      r :: StepResult
      r = f txt
    in
      if snd r
        then fst r
        else getFirstSR fs txt

  sortByLengthDown :: List -> List
  sortByLengthDown = DL.sortBy (DO.comparing (DO.Down . T.length))