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