{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TupleSections #-}

-- | Pretty-printing of language pragmas.
module Ormolu.Printer.Meat.Pragma
  ( p_pragmas,
  )
where

import qualified Data.Set as S
import qualified Data.Text as T
import Ormolu.Parser.Pragma (Pragma (..))
import Ormolu.Printer.Combinators

data PragmaTy = Language | OptionsGHC | OptionsHaddock
  deriving (Eq, Ord)

p_pragmas :: [Pragma] -> R ()
p_pragmas ps =
  let prepare = concatMap $ \case
        PragmaLanguage xs -> (Language,) <$> xs
        PragmaOptionsGHC x -> [(OptionsGHC, x)]
        PragmaOptionsHaddock x -> [(OptionsHaddock, x)]
   in mapM_ (uncurry p_pragma) (S.toAscList . S.fromList . prepare $ ps)

p_pragma :: PragmaTy -> String -> R ()
p_pragma ty c = do
  txt "{-# "
  txt $ case ty of
    Language -> "LANGUAGE"
    OptionsGHC -> "OPTIONS_GHC"
    OptionsHaddock -> "OPTIONS_HADDOCK"
  space
  txt (T.pack c)
  txt " #-}"
  newline