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
import qualified Language.Haskell.Formatter.Toolkit.ListTool as ListTool
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
= ListTool.dropWhileAtMost Char.isSpace spaceLimit $ content comment
spaceLimit = 1