{-# LANGUAGE OverloadedStrings #-}
-- | Functions specific to emacs tags.
module FastTags.Emacs (format) where
import qualified Data.Text as Text
import Data.Text (Text)

import qualified FastTags.Tag as Tag
import qualified FastTags.Token as Token
import qualified FastTags.Util as Util
import qualified FastTags.Vim as Vim


format :: Int -> [Token.Pos Tag.TagVal] -> [Text]
format maxSeparation = map (uncurry formatFileTags)
    . map (fmap (Vim.dropAdjacentInFile lineOf maxSeparation))
    . Util.groupOnKey (Token.posFile . Token.posOf)
    where lineOf = Token.unLine . Token.posLine . Token.posOf

formatFileTags :: FilePath -> [Token.Pos Tag.TagVal] -> Text
formatFileTags file tags = Text.concat
    [ "\x0c\x0a", Text.pack file, ","
    , Text.pack $ show (Text.length tagsText), "\x0a", tagsText
    ]
    where tagsText = Text.unlines $ map formatTag tags

formatTag :: Token.Pos Tag.TagVal -> Text
formatTag (Token.Pos pos (Tag.TagVal {})) = Text.concat
    [ Token.posPrefix pos
    , "\x7f"
    , Text.pack (show $ Token.unLine (Token.posLine pos))
    ]