content: {-# LANGUAGE ViewPatterns #-}
  {-# LANGUAGE PatternSynonyms #-}
  {-# LANGUAGE OverloadedStrings #-}
  module Clay.Comments where
  
  import Data.Maybe (isNothing)
  import Data.List (partition)
  
  import Clay.Stylesheet
  
  -- | Annotate the supplied 'Css' with the supplied comment.
  -- Comments work with 'OverloadedStrings'. This will annotate every non-nested
  -- value.
  commenting :: CommentText -> Css -> Css
  commenting c css = foldMap (rule . addComment c) $ runS css
  infixl 3 `commenting`
  
  -- The last case indicates there may be something wrong in the typing, as
  -- it shouldn't be possible to comment a wrong rule. In practice, this implementation
  -- means only the directly applied property rule is affected, i.e. no nested
  -- rules. That could be changed by adding recursive cases.
  addComment :: CommentText -> Rule -> Rule
  addComment c (Property (PartitionComments xs (Just cs)) k v) = let c1 = Comment $ cs <> "; " <> c in
    Property (c1 : xs) k v
  addComment c (Property ms k v  ) = Property (Comment c : ms) k v
  addComment _ r                   = r
  
  pattern PartitionComments :: [Modifier] -> Maybe CommentText -> [Modifier]
  pattern PartitionComments xs cs <- (fmap (foldMap _Comment) . partition (isNothing . _Comment) -> (xs, cs))
  