{-# LANGUAGE OverloadedStrings #-}

module Prettyprinter.Debug ( prettyBind
                           , prettyBound
                           , (<#*>)
                           ) where

import           Data.Semigroup ((<>))
import           Prettyprinter  (Doc, Pretty (pretty), hardline, indent, (<+>))


(<#*>) :: Doc a -> Doc a -> Doc a
<#*> :: Doc a -> Doc a -> Doc a
(<#*>) Doc a
x Doc a
y = Doc a
x Doc a -> Doc a -> Doc a
forall a. Semigroup a => a -> a -> a
<> Doc a
forall ann. Doc ann
hardline Doc a -> Doc a -> Doc a
forall a. Semigroup a => a -> a -> a
<> Int -> Doc a -> Doc a
forall ann. Int -> Doc ann -> Doc ann
indent Int
2 Doc a
y

prettyBind :: (Pretty c, Pretty b) => (c, b) -> Doc a
prettyBind :: (c, b) -> Doc a
prettyBind (c
i, b
j) = c -> Doc a
forall a ann. Pretty a => a -> Doc ann
pretty c
i Doc a -> Doc a -> Doc a
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc a
"→" Doc a -> Doc a -> Doc a
forall ann. Doc ann -> Doc ann -> Doc ann
<+> b -> Doc a
forall a ann. Pretty a => a -> Doc ann
pretty b
j

prettyBound :: (Pretty a, Pretty c) => (a, c) -> Doc b
prettyBound :: (a, c) -> Doc b
prettyBound (a
i, c
e) = a -> Doc b
forall a ann. Pretty a => a -> Doc ann
pretty a
i Doc b -> Doc b -> Doc b
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc b
"←" Doc b -> Doc b -> Doc b
forall ann. Doc ann -> Doc ann -> Doc ann
<#*> c -> Doc b
forall a ann. Pretty a => a -> Doc ann
pretty c
e