diff --git a/app/Unified.hs b/app/Unified.hs index be4c7094d..5d0cc0082 100644 --- a/app/Unified.hs +++ b/app/Unified.hs @@ -14,26 +14,26 @@ import Rainbow unified :: Diff a Info -> String -> String -> IO ByteString unified diff before after = do renderer <- byteStringMakerFromEnvironment - return . mconcat . chunksToByteStrings renderer . pure . fst $ iter g mapped where + return . mconcat . chunksToByteStrings renderer . fst $ iter g mapped where mapped = fmap (unifiedPatch &&& range) diff g (Annotated (_, info) syntax) = f info syntax - f (Info range _) (Leaf _) = (chunk $ substring range after, Just range) + f (Info range _) (Leaf _) = (pure . chunk $ substring range after, Just range) f (Info range _) (Indexed i) = (unifiedRange range i after, Just range) f (Info range _) (Fixed f) = (unifiedRange range f after, Just range) f (Info range _) (Keyed k) = (unifiedRange range (sort $ snd <$> Map.toList k) after, Just range) - unifiedPatch :: Patch (Term a Info) -> Chunk String - unifiedPatch patch = (beforeChunk & fore red & bold) <> (afterChunk & fore green & bold) where - beforeChunk = maybe (chunk "") (change "-" . unifiedTerm before) $ Patch.before patch - afterChunk = maybe (chunk "") (change "+" . unifiedTerm after) $ Patch.after patch + unifiedPatch :: Patch (Term a Info) -> [Chunk String] + unifiedPatch patch = (fore red . bold <$> beforeChunk) <> (fore green . bold <$> afterChunk) where + beforeChunk = maybe [] (change "-" . unifiedTerm before) $ Patch.before patch + afterChunk = maybe [] (change "+" . unifiedTerm after) $ Patch.after patch - unifiedTerm :: String -> Term a Info -> Chunk String + unifiedTerm :: String -> Term a Info -> [Chunk String] unifiedTerm source term = fst $ cata f term - unifiedRange :: Range -> [(Chunk String, Maybe Range)] -> String -> Chunk String - unifiedRange range children source = out <> (chunk $ substring Range { start = previous, end = end range } after) where - (out, previous) = foldl accumulateContext (chunk "", start range) children - accumulateContext (out, previous) (child, Just range) = (mconcat [ out, chunk $ substring Range { start = previous, end = start range } source, child ], end range) + unifiedRange :: Range -> [([Chunk String], Maybe Range)] -> String -> [Chunk String] + unifiedRange range children source = out <> (pure . chunk $ substring Range { start = previous, end = end range } after) where + (out, previous) = foldl accumulateContext ([], start range) children + accumulateContext (out, previous) (child, Just range) = (mconcat [ out, pure . chunk $ substring Range { start = previous, end = start range } source, child ], end range) accumulateContext (out, previous) (child, _) = (out <> child, previous) substring :: Range -> String -> String @@ -44,8 +44,8 @@ range patch = range . extract <$> after patch where extract (annotation :< _) = annotation range (Info range _) = range -change :: String -> Chunk String -> Chunk String -change bound content = mconcat [ chunk "{", chunk bound, content, chunk bound, chunk "}" ] +change :: String -> [Chunk String] -> [Chunk String] +change bound content = [ chunk "{", chunk bound ] ++ content ++ [ chunk bound, chunk "}" ] instance Ord Range where a <= b = start a <= start b