module Main where import Control.Monad.IO.Class (MonadIO, liftIO) import qualified Data.Aeson as A import qualified Data.ByteString.Lazy as BS import qualified Data.List as L import qualified Data.Text as T import System.Process (readProcess) import qualified TokenSearch main :: MonadIO m => m () main = do tokens <- calculateTokens results <- TokenSearch.calculateResults tokens =<< TokenSearch.calculateFileNames liftIO $ BS.putStr $ A.encode results calculateTokens :: MonadIO m => m [T.Text] calculateTokens = tokensFromTags . T.pack <$> liftIO (readProcess "cat" [".git/tags"] []) tokensFromTags :: T.Text -> [T.Text] tokensFromTags = L.nub . tokenLocations where tokenLocations = map (head . T.splitOn "\t") . T.lines