-- 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
Doc
Empty <+> :: Doc -> Doc -> Doc
<+> Doc
y = Doc
y
Doc
x <+> Doc
Empty = Doc
x
Doc
x <+> Doc
y = Doc
x Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
forall ann. Doc ann
space Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
y
infixr 6 <+>

Doc
x <$> :: Doc -> Doc -> Doc
<$> Doc
Empty = Doc
x
Doc
Empty <$> Doc
y = Doc
y
Doc
x <$> Doc
y = Doc
x Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
forall ann. Doc ann
line Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
y

Doc
x </> :: Doc -> Doc -> Doc
</> Doc
Empty = Doc
x
Doc
Empty </> Doc
y = Doc
y
Doc
x </> Doc
y = Doc
x Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
forall ann. Doc ann
softline Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
y

Doc
x <$$> :: Doc -> Doc -> Doc
<$$> Doc
Empty = Doc
x
Doc
Empty <$$> Doc
y = Doc
y
Doc
x <$$> Doc
y = Doc
x Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
linebreak Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
y

Doc
x <//> :: Doc -> Doc -> Doc
<//> Doc
Empty = Doc
x
Doc
Empty <//> Doc
y = Doc
y
Doc
x <//> Doc
y = Doc
x Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
softbreak Doc -> Doc -> Doc
forall a. Semigroup a => a -> a -> a
<> Doc
y
infixr 5 </>,<//>,<$>,<$$>