packages feed

morley-prelude-0.5.3: src/Fmt/Operators.hs

-- SPDX-FileCopyrightText: 2023 Oxhead Alpha
-- SPDX-License-Identifier: LicenseRef-MIT-OA

{-# LANGUAGE NoImplicitPrelude #-}

-- | Extra operators on top of "Prettyprinter" with additional semantics.
module Fmt.Operators
  ( (<//>)
  , (</>)
  , (<+>)
  , (<$>)
  , (<$$>)
  ) where

import Universum ((<>))

import Fmt.Utils (Doc, linebreak, softbreak)
import Prettyprinter (line, softline, space)
import Prettyprinter.Internal (pattern Empty)

(<+>), (<$>), (</>), (<$$>), (<//>) :: Doc -> Doc -> Doc
Empty <+> y = y
x <+> Empty = x
x <+> y = x <> space <> y
infixr 6 <+>

x <$> Empty = x
Empty <$> y = y
x <$> y = x <> line <> y

x </> Empty = x
Empty </> y = y
x </> y = x <> softline <> y

x <$$> Empty = x
Empty <$$> y = y
x <$$> y = x <> linebreak <> y

x <//> Empty = x
Empty <//> y = y
x <//> y = x <> softbreak <> y
infixr 5 </>,<//>,<$>,<$$>