module System.Ctags
    ( TagSearchOutcome(..)
    , tokensFromFile
    , tokensFromStdin
    ) where

import Control.Monad.IO.Class (MonadIO)
import qualified Data.Text.Lazy as T
import System.Ctags.Internal
import System.Ctags.Types

tokensFromFile :: MonadIO m => m (Either TagSearchOutcome [T.Text])
tokensFromFile = fmap tokensFromTags <$> tagsContent

tokensFromStdin :: MonadIO m => m (Either TagSearchOutcome [T.Text])
tokensFromStdin = Right . tokensFromTags <$> stdinContent

tokensFromTags :: T.Text -> [T.Text]
tokensFromTags = filter validTokens . uniqueList . tokenLocations . T.lines
  where
    tokenLocations = map (head . T.splitOn "\t")

validTokens :: T.Text -> Bool
validTokens = not . T.isPrefixOf "!_TAG"