module Agda.Utils.String
  ( quote
  , addFinalNewLine
  , indent
  ) where

import Data.List

-- | 'quote' adds double quotes around the string, and escapes double
-- quotes and backslashes within the string. This is different from
-- the behaviour of 'show':
--
-- @
-- \> 'System.IO.UTF8.putStrLn' $ 'show' \"\\x2200\"
-- \"\\8704\"
-- \> 'System.IO.UTF8.putStrLn' $ 'quote' \"\\x2200\"
-- \"∀\"
-- @

quote :: String -> String
quote s = "\"" ++ concatMap escape s ++ "\""
  where
  escape c | c `elem` escapeChars = ['\\', c]
           | otherwise            = [c]

  escapeChars = "\"\\"

-- | Adds a final newline if there is not already one.

addFinalNewLine :: String -> String
addFinalNewLine "" = "\n"
addFinalNewLine s | last s == '\n' = s
                  | otherwise      = s ++ "\n"

-- | Indents every line the given number of steps.

indent :: Integral i => i -> String -> String
indent i = unlines . map (genericReplicate i ' ' ++) . lines