{-|
Description : Comments without location
-}
module Language.Haskell.Formatter.CommentCore
       (CommentCore, kind, content, Kind(..), DocumentationDisplacement(..),
        create, wrappedLineCount, documentationDisplacement)
       where
import qualified Data.Char as Char
import qualified Data.Monoid as Monoid
import qualified Language.Haskell.Formatter.Internal.Newline as Newline

data CommentCore = CommentCore{kind :: Kind, content :: String}
                 deriving (Eq, Ord)

data Kind = Ordinary
          | Nested
          deriving (Eq, Ord, Show)

data DocumentationDisplacement = BeforeActualCode
                               | AfterActualCode
                               | None
                               deriving (Eq, Ord, Show)

instance Show CommentCore where
        show comment
          = case kind comment of
                Ordinary -> Monoid.mappend "--" rawContent
                Nested -> concat ["{-", rawContent, "-}"]
          where rawContent = content comment

create :: Kind -> String -> CommentCore
create rawKind rawContent = CommentCore{kind = rawKind, content = rawContent}

wrappedLineCount :: CommentCore -> Int
wrappedLineCount = length . Newline.splitSeparatedLines . show

documentationDisplacement :: CommentCore -> DocumentationDisplacement
documentationDisplacement comment
  = case unwrappedContent of
        ('|' : _) -> BeforeActualCode
        ('^' : _) -> AfterActualCode
        _ -> None
  where unwrappedContent
          = Monoid.mappend (dropWhile Char.isSpace deformable) rigid
        (deformable, rigid) = splitAt spaceLimit $ content comment
        spaceLimit = 1