module Language.Haskell.Formatter.Process.Code
(LocatableCode, CommentableCode, LocatableCommentableCode,
tryZipLocationsComments, dropComments, dropLocations)
where
import qualified Language.Haskell.Formatter.Location as Location
import qualified Language.Haskell.Formatter.Process.Note as Note
import qualified Language.Haskell.Formatter.Result as Result
import qualified Language.Haskell.Formatter.Source as Source
import qualified Language.Haskell.Formatter.Toolkit.Visit as Visit
type LocatableCode = Source.Module Location.SrcSpanInfo
type CommentableCode = Source.Module Note.CommentNote
type LocatableCommentableCode = Source.Module Note.LocationCommentNote
tryZipLocationsComments ::
LocatableCode ->
CommentableCode ->
Result.Result LocatableCommentableCode
tryZipLocationsComments locatable commentable
= case maybeZipped of
Nothing -> Result.fatalAssertionError message
where message = "The code notes could not be zipped."
Just zipped -> return zipped
where maybeZipped
= if isActualCodeSame then maybeLocatableCommentable else Nothing
isActualCodeSame = locatable Source.=~= commentable
maybeLocatableCommentable
= Visit.halfZipWith Note.createLocationCommentNote locatable
commentable
dropComments :: LocatableCommentableCode -> LocatableCode
dropComments = fmap Note.locationNote
dropLocations :: LocatableCommentableCode -> CommentableCode
dropLocations = fmap Note.commentNote