{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
module Cmt.Parser.Config.Format
( formatP
) where
import ClassyPrelude
import Data.Attoparsec.Text
import Cmt.Parser.Attoparsec
import Cmt.Types.Config
merge :: [FormatPart] -> FormatPart -> [FormatPart]
merge ps (Literal str) = maybe [Literal str] merge' (fromNullable ps)
where
merge' ps' =
case last ps' of
Literal prev -> init ps' <> [Literal (prev <> str)]
_ -> ps <> [Literal str]
merge ps p = ps <> [p]
smoosh :: [FormatPart] -> [FormatPart]
smoosh = foldl' merge []
formatNamedP :: [Name] -> Parser FormatPart
formatNamedP names = Named <$> (string "${" *> valid names <* char '}')
formatLiteralP :: Parser FormatPart
formatLiteralP = Literal <$> (singleton <$> anyChar)
formatP :: [Name] -> Parser [FormatPart]
formatP names = smoosh <$> stripComments (many1 (formatNamedP names <|> formatLiteralP))