{-# LANGUAGE OverloadedStrings #-}
module Symantic.Parser.Grammar.Write where

import Control.Monad (Monad(..))
import Data.Function (($))
import Data.Maybe (Maybe(..), fromMaybe, catMaybes)
import Data.Monoid (Monoid(..))
import Data.Semigroup (Semigroup(..))
import Data.String (IsString(..))
import Text.Show (Show(..))
import qualified Data.Functor as Pre
import qualified Data.List as List
import qualified Data.Text.Lazy as TL
import qualified Data.Text.Lazy.Builder as TLB

import Symantic.Univariant.Letable
import Symantic.Parser.Grammar.Combinators
import Symantic.Parser.Grammar.Fixity

-- * Type 'WriteComb'
newtype WriteComb a = WriteComb { forall a. WriteComb a -> WriteCombInh -> Maybe Builder
unWriteComb :: WriteCombInh -> Maybe TLB.Builder }

instance IsString (WriteComb a) where
  fromString :: String -> WriteComb a
fromString String
s = (WriteCombInh -> Maybe Builder) -> WriteComb a
forall a. (WriteCombInh -> Maybe Builder) -> WriteComb a
WriteComb ((WriteCombInh -> Maybe Builder) -> WriteComb a)
-> (WriteCombInh -> Maybe Builder) -> WriteComb a
forall a b. (a -> b) -> a -> b
$ \WriteCombInh
_inh ->
    if String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
List.null String
s then Maybe Builder
forall a. Maybe a
Nothing
    else Builder -> Maybe Builder
forall a. a -> Maybe a
Just (String -> Builder
forall a. IsString a => String -> a
fromString String
s)

-- ** Type 'WriteCombInh'
data WriteCombInh
 =   WriteCombInh
 {   WriteCombInh -> Builder
writeCombInh_indent :: TLB.Builder
 ,   WriteCombInh -> (Infix, Side)
writeCombInh_op :: (Infix, Side)
 ,   WriteCombInh -> Pair
writeCombInh_pair :: Pair
 }

emptyWriteCombInh :: WriteCombInh
emptyWriteCombInh :: WriteCombInh
emptyWriteCombInh = WriteCombInh :: Builder -> (Infix, Side) -> Pair -> WriteCombInh
WriteCombInh
 { writeCombInh_indent :: Builder
writeCombInh_indent = Builder
"\n"
 , writeCombInh_op :: (Infix, Side)
writeCombInh_op = (Infix
infixN0, Side
SideL)
 , writeCombInh_pair :: Pair
writeCombInh_pair = Pair
pairParen
 }

writeComb :: WriteComb a -> TL.Text
writeComb :: forall a. WriteComb a -> Text
writeComb (WriteComb WriteCombInh -> Maybe Builder
r) = Builder -> Text
TLB.toLazyText (Builder -> Text) -> Builder -> Text
forall a b. (a -> b) -> a -> b
$ Builder -> Maybe Builder -> Builder
forall a. a -> Maybe a -> a
fromMaybe Builder
"" (Maybe Builder -> Builder) -> Maybe Builder -> Builder
forall a b. (a -> b) -> a -> b
$ WriteCombInh -> Maybe Builder
r WriteCombInh
emptyWriteCombInh

pairWriteCombInh ::
 Semigroup s => IsString s =>
 WriteCombInh -> Infix -> Maybe s -> Maybe s
pairWriteCombInh :: forall s.
(Semigroup s, IsString s) =>
WriteCombInh -> Infix -> Maybe s -> Maybe s
pairWriteCombInh WriteCombInh
inh Infix
op Maybe s
s =
  if (Infix, Side) -> Infix -> Bool
isPairNeeded (WriteCombInh -> (Infix, Side)
writeCombInh_op WriteCombInh
inh) Infix
op
  then s -> Maybe s
forall a. a -> Maybe a
Just (String -> s
forall a. IsString a => String -> a
fromString String
os -> s -> s
forall a. Semigroup a => a -> a -> a
<>s
" ")Maybe s -> Maybe s -> Maybe s
forall a. Semigroup a => a -> a -> a
<>Maybe s
sMaybe s -> Maybe s -> Maybe s
forall a. Semigroup a => a -> a -> a
<>s -> Maybe s
forall a. a -> Maybe a
Just (s
" "s -> s -> s
forall a. Semigroup a => a -> a -> a
<>String -> s
forall a. IsString a => String -> a
fromString String
c)
  else Maybe s
s
  where (String
o,String
c) = WriteCombInh -> Pair
writeCombInh_pair WriteCombInh
inh

instance Show letName => Letable letName WriteComb where
  def :: forall a. letName -> WriteComb a -> WriteComb a
def letName
name WriteComb a
x = (WriteCombInh -> Maybe Builder) -> WriteComb a
forall a. (WriteCombInh -> Maybe Builder) -> WriteComb a
WriteComb ((WriteCombInh -> Maybe Builder) -> WriteComb a)
-> (WriteCombInh -> Maybe Builder) -> WriteComb a
forall a b. (a -> b) -> a -> b
$ \WriteCombInh
inh ->
    WriteCombInh -> Infix -> Maybe Builder -> Maybe Builder
forall s.
(Semigroup s, IsString s) =>
WriteCombInh -> Infix -> Maybe s -> Maybe s
pairWriteCombInh WriteCombInh
inh Infix
op (Maybe Builder -> Maybe Builder) -> Maybe Builder -> Maybe Builder
forall a b. (a -> b) -> a -> b
$
      Builder -> Maybe Builder
forall a. a -> Maybe a
Just Builder
"def "
      Maybe Builder -> Maybe Builder -> Maybe Builder
forall a. Semigroup a => a -> a -> a
<> Builder -> Maybe Builder
forall a. a -> Maybe a
Just (String -> Builder
forall a. IsString a => String -> a
fromString (letName -> String
forall a. Show a => a -> String
show letName
name))
      Maybe Builder -> Maybe Builder -> Maybe Builder
forall a. Semigroup a => a -> a -> a
<> WriteComb a -> WriteCombInh -> Maybe Builder
forall a. WriteComb a -> WriteCombInh -> Maybe Builder
unWriteComb WriteComb a
x WriteCombInh
inh
    where
    op :: Infix
op = Precedence -> Infix
infixN Precedence
9
  ref :: forall a. Bool -> letName -> WriteComb a
ref Bool
rec letName
name = (WriteCombInh -> Maybe Builder) -> WriteComb a
forall a. (WriteCombInh -> Maybe Builder) -> WriteComb a
WriteComb ((WriteCombInh -> Maybe Builder) -> WriteComb a)
-> (WriteCombInh -> Maybe Builder) -> WriteComb a
forall a b. (a -> b) -> a -> b
$ \WriteCombInh
inh ->
    WriteCombInh -> Infix -> Maybe Builder -> Maybe Builder
forall s.
(Semigroup s, IsString s) =>
WriteCombInh -> Infix -> Maybe s -> Maybe s
pairWriteCombInh WriteCombInh
inh Infix
op (Maybe Builder -> Maybe Builder) -> Maybe Builder -> Maybe Builder
forall a b. (a -> b) -> a -> b
$
      Builder -> Maybe Builder
forall a. a -> Maybe a
Just (if Bool
rec then Builder
"rec " else Builder
"ref ") Maybe Builder -> Maybe Builder -> Maybe Builder
forall a. Semigroup a => a -> a -> a
<>
      Builder -> Maybe Builder
forall a. a -> Maybe a
Just (String -> Builder
forall a. IsString a => String -> a
fromString (letName -> String
forall a. Show a => a -> String
show letName
name))
    where
    op :: Infix
op = Precedence -> Infix
infixN Precedence
9
instance Applicable WriteComb where
  pure :: forall a. Haskell a -> WriteComb a
pure Haskell a
_ = (WriteCombInh -> Maybe Builder) -> WriteComb a
forall a. (WriteCombInh -> Maybe Builder) -> WriteComb a
WriteComb ((WriteCombInh -> Maybe Builder) -> WriteComb a)
-> (WriteCombInh -> Maybe Builder) -> WriteComb a
forall a b. (a -> b) -> a -> b
$ Maybe Builder -> WriteCombInh -> Maybe Builder
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe Builder
forall a. Maybe a
Nothing
  -- pure _ = "pure"
  WriteComb WriteCombInh -> Maybe Builder
x <*> :: forall a b. WriteComb (a -> b) -> WriteComb a -> WriteComb b
<*> WriteComb WriteCombInh -> Maybe Builder
y = (WriteCombInh -> Maybe Builder) -> WriteComb b
forall a. (WriteCombInh -> Maybe Builder) -> WriteComb a
WriteComb ((WriteCombInh -> Maybe Builder) -> WriteComb b)
-> (WriteCombInh -> Maybe Builder) -> WriteComb b
forall a b. (a -> b) -> a -> b
$ \WriteCombInh
inh ->
    let inh' :: Side -> WriteCombInh
inh' Side
side = WriteCombInh
inh
         { writeCombInh_op :: (Infix, Side)
writeCombInh_op = (Infix
op, Side
side)
         , writeCombInh_pair :: Pair
writeCombInh_pair = Pair
pairParen
         } in
    case WriteCombInh -> Maybe Builder
x (Side -> WriteCombInh
inh' Side
SideL) of
     Maybe Builder
Nothing -> WriteCombInh -> Maybe Builder
y (Side -> WriteCombInh
inh' Side
SideR)
     Just Builder
xt ->
      case WriteCombInh -> Maybe Builder
y (Side -> WriteCombInh
inh' Side
SideR) of
       Maybe Builder
Nothing -> Builder -> Maybe Builder
forall a. a -> Maybe a
Just Builder
xt
       Just Builder
yt ->
        WriteCombInh -> Infix -> Maybe Builder -> Maybe Builder
forall s.
(Semigroup s, IsString s) =>
WriteCombInh -> Infix -> Maybe s -> Maybe s
pairWriteCombInh WriteCombInh
inh Infix
op (Maybe Builder -> Maybe Builder) -> Maybe Builder -> Maybe Builder
forall a b. (a -> b) -> a -> b
$
          Builder -> Maybe Builder
forall a. a -> Maybe a
Just (Builder -> Maybe Builder) -> Builder -> Maybe Builder
forall a b. (a -> b) -> a -> b
$ Builder
xt Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Builder
", " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Builder
yt
    where
    op :: Infix
op = Precedence -> Infix
infixN Precedence
1
instance Alternable WriteComb where
  empty :: forall a. WriteComb a
empty = WriteComb a
"empty"
  try :: forall a. WriteComb a -> WriteComb a
try WriteComb a
x = (WriteCombInh -> Maybe Builder) -> WriteComb a
forall a. (WriteCombInh -> Maybe Builder) -> WriteComb a
WriteComb ((WriteCombInh -> Maybe Builder) -> WriteComb a)
-> (WriteCombInh -> Maybe Builder) -> WriteComb a
forall a b. (a -> b) -> a -> b
$ \WriteCombInh
inh ->
    WriteCombInh -> Infix -> Maybe Builder -> Maybe Builder
forall s.
(Semigroup s, IsString s) =>
WriteCombInh -> Infix -> Maybe s -> Maybe s
pairWriteCombInh WriteCombInh
inh Infix
op (Maybe Builder -> Maybe Builder) -> Maybe Builder -> Maybe Builder
forall a b. (a -> b) -> a -> b
$
      Builder -> Maybe Builder
forall a. a -> Maybe a
Just Builder
"try " Maybe Builder -> Maybe Builder -> Maybe Builder
forall a. Semigroup a => a -> a -> a
<> WriteComb a -> WriteCombInh -> Maybe Builder
forall a. WriteComb a -> WriteCombInh -> Maybe Builder
unWriteComb WriteComb a
x WriteCombInh
inh
    where
    op :: Infix
op = Precedence -> Infix
infixN Precedence
9
  WriteComb a
x <|> :: forall a. WriteComb a -> WriteComb a -> WriteComb a
<|> WriteComb a
y = (WriteCombInh -> Maybe Builder) -> WriteComb a
forall a. (WriteCombInh -> Maybe Builder) -> WriteComb a
WriteComb ((WriteCombInh -> Maybe Builder) -> WriteComb a)
-> (WriteCombInh -> Maybe Builder) -> WriteComb a
forall a b. (a -> b) -> a -> b
$ \WriteCombInh
inh ->
    WriteCombInh -> Infix -> Maybe Builder -> Maybe Builder
forall s.
(Semigroup s, IsString s) =>
WriteCombInh -> Infix -> Maybe s -> Maybe s
pairWriteCombInh WriteCombInh
inh Infix
op (Maybe Builder -> Maybe Builder) -> Maybe Builder -> Maybe Builder
forall a b. (a -> b) -> a -> b
$
    WriteComb a -> WriteCombInh -> Maybe Builder
forall a. WriteComb a -> WriteCombInh -> Maybe Builder
unWriteComb WriteComb a
x WriteCombInh
inh
     { writeCombInh_op :: (Infix, Side)
writeCombInh_op = (Infix
op, Side
SideL)
     , writeCombInh_pair :: Pair
writeCombInh_pair = Pair
pairParen
     } Maybe Builder -> Maybe Builder -> Maybe Builder
forall a. Semigroup a => a -> a -> a
<>
    Builder -> Maybe Builder
forall a. a -> Maybe a
Just Builder
" | " Maybe Builder -> Maybe Builder -> Maybe Builder
forall a. Semigroup a => a -> a -> a
<>
    WriteComb a -> WriteCombInh -> Maybe Builder
forall a. WriteComb a -> WriteCombInh -> Maybe Builder
unWriteComb WriteComb a
y WriteCombInh
inh
     { writeCombInh_op :: (Infix, Side)
writeCombInh_op = (Infix
op, Side
SideR)
     , writeCombInh_pair :: Pair
writeCombInh_pair = Pair
pairParen
     }
    where op :: Infix
op = Side -> Precedence -> Infix
infixB Side
SideL Precedence
3
instance Satisfiable WriteComb tok where
  satisfy :: [ErrorItem tok] -> Haskell (tok -> Bool) -> WriteComb tok
satisfy [ErrorItem tok]
_es Haskell (tok -> Bool)
_f = WriteComb tok
"satisfy"
instance Selectable WriteComb where
  branch :: forall a b c.
WriteComb (Either a b)
-> WriteComb (a -> c) -> WriteComb (b -> c) -> WriteComb c
branch WriteComb (Either a b)
lr WriteComb (a -> c)
l WriteComb (b -> c)
r = (WriteCombInh -> Maybe Builder) -> WriteComb c
forall a. (WriteCombInh -> Maybe Builder) -> WriteComb a
WriteComb ((WriteCombInh -> Maybe Builder) -> WriteComb c)
-> (WriteCombInh -> Maybe Builder) -> WriteComb c
forall a b. (a -> b) -> a -> b
$ \WriteCombInh
inh ->
    WriteCombInh -> Infix -> Maybe Builder -> Maybe Builder
forall s.
(Semigroup s, IsString s) =>
WriteCombInh -> Infix -> Maybe s -> Maybe s
pairWriteCombInh WriteCombInh
inh Infix
op (Maybe Builder -> Maybe Builder) -> Maybe Builder -> Maybe Builder
forall a b. (a -> b) -> a -> b
$
      Builder -> Maybe Builder
forall a. a -> Maybe a
Just Builder
"branch " Maybe Builder -> Maybe Builder -> Maybe Builder
forall a. Semigroup a => a -> a -> a
<>
      WriteComb (Either a b) -> WriteCombInh -> Maybe Builder
forall a. WriteComb a -> WriteCombInh -> Maybe Builder
unWriteComb WriteComb (Either a b)
lr WriteCombInh
inh Maybe Builder -> Maybe Builder -> Maybe Builder
forall a. Semigroup a => a -> a -> a
<> Builder -> Maybe Builder
forall a. a -> Maybe a
Just Builder
" " Maybe Builder -> Maybe Builder -> Maybe Builder
forall a. Semigroup a => a -> a -> a
<>
      WriteComb (a -> c) -> WriteCombInh -> Maybe Builder
forall a. WriteComb a -> WriteCombInh -> Maybe Builder
unWriteComb WriteComb (a -> c)
l WriteCombInh
inh Maybe Builder -> Maybe Builder -> Maybe Builder
forall a. Semigroup a => a -> a -> a
<> Builder -> Maybe Builder
forall a. a -> Maybe a
Just Builder
" " Maybe Builder -> Maybe Builder -> Maybe Builder
forall a. Semigroup a => a -> a -> a
<>
      WriteComb (b -> c) -> WriteCombInh -> Maybe Builder
forall a. WriteComb a -> WriteCombInh -> Maybe Builder
unWriteComb WriteComb (b -> c)
r WriteCombInh
inh
    where
    op :: Infix
op = Precedence -> Infix
infixN Precedence
9
instance Matchable WriteComb where
  conditional :: forall a b.
Eq a =>
[Haskell (a -> Bool)]
-> [WriteComb b] -> WriteComb a -> WriteComb b -> WriteComb b
conditional [Haskell (a -> Bool)]
_ps [WriteComb b]
bs WriteComb a
a WriteComb b
d = (WriteCombInh -> Maybe Builder) -> WriteComb b
forall a. (WriteCombInh -> Maybe Builder) -> WriteComb a
WriteComb ((WriteCombInh -> Maybe Builder) -> WriteComb b)
-> (WriteCombInh -> Maybe Builder) -> WriteComb b
forall a b. (a -> b) -> a -> b
$ \WriteCombInh
inh ->
    WriteCombInh -> Infix -> Maybe Builder -> Maybe Builder
forall s.
(Semigroup s, IsString s) =>
WriteCombInh -> Infix -> Maybe s -> Maybe s
pairWriteCombInh WriteCombInh
inh Infix
op (Maybe Builder -> Maybe Builder) -> Maybe Builder -> Maybe Builder
forall a b. (a -> b) -> a -> b
$
      Builder -> Maybe Builder
forall a. a -> Maybe a
Just Builder
"conditional " Maybe Builder -> Maybe Builder -> Maybe Builder
forall a. Semigroup a => a -> a -> a
<>
      Builder -> Maybe Builder
forall a. a -> Maybe a
Just Builder
"[" Maybe Builder -> Maybe Builder -> Maybe Builder
forall a. Semigroup a => a -> a -> a
<>
      Builder -> Maybe Builder
forall a. a -> Maybe a
Just ([Builder] -> Builder
forall a. Monoid a => [a] -> a
mconcat (Builder -> [Builder] -> [Builder]
forall a. a -> [a] -> [a]
List.intersperse Builder
", " ([Builder] -> [Builder]) -> [Builder] -> [Builder]
forall a b. (a -> b) -> a -> b
$
      [Maybe Builder] -> [Builder]
forall a. [Maybe a] -> [a]
catMaybes ([Maybe Builder] -> [Builder]) -> [Maybe Builder] -> [Builder]
forall a b. (a -> b) -> a -> b
$ ((WriteComb b -> Maybe Builder) -> [WriteComb b] -> [Maybe Builder]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Pre.<$> [WriteComb b]
bs) ((WriteComb b -> Maybe Builder) -> [Maybe Builder])
-> (WriteComb b -> Maybe Builder) -> [Maybe Builder]
forall a b. (a -> b) -> a -> b
$ \WriteComb b
x ->
        WriteComb b -> WriteCombInh -> Maybe Builder
forall a. WriteComb a -> WriteCombInh -> Maybe Builder
unWriteComb WriteComb b
x WriteCombInh
inh{writeCombInh_op :: (Infix, Side)
writeCombInh_op=(Precedence -> Infix
infixN Precedence
0, Side
SideL)})) Maybe Builder -> Maybe Builder -> Maybe Builder
forall a. Semigroup a => a -> a -> a
<>
      Builder -> Maybe Builder
forall a. a -> Maybe a
Just Builder
"] " Maybe Builder -> Maybe Builder -> Maybe Builder
forall a. Semigroup a => a -> a -> a
<>
      WriteComb a -> WriteCombInh -> Maybe Builder
forall a. WriteComb a -> WriteCombInh -> Maybe Builder
unWriteComb WriteComb a
a WriteCombInh
inh Maybe Builder -> Maybe Builder -> Maybe Builder
forall a. Semigroup a => a -> a -> a
<> Builder -> Maybe Builder
forall a. a -> Maybe a
Just Builder
" " Maybe Builder -> Maybe Builder -> Maybe Builder
forall a. Semigroup a => a -> a -> a
<>
      WriteComb b -> WriteCombInh -> Maybe Builder
forall a. WriteComb a -> WriteCombInh -> Maybe Builder
unWriteComb WriteComb b
d WriteCombInh
inh
    where
    op :: Infix
op = Precedence -> Infix
infixN Precedence
9
instance Lookable WriteComb where
  look :: forall a. WriteComb a -> WriteComb a
look WriteComb a
x = (WriteCombInh -> Maybe Builder) -> WriteComb a
forall a. (WriteCombInh -> Maybe Builder) -> WriteComb a
WriteComb ((WriteCombInh -> Maybe Builder) -> WriteComb a)
-> (WriteCombInh -> Maybe Builder) -> WriteComb a
forall a b. (a -> b) -> a -> b
$ \WriteCombInh
inh ->
    WriteCombInh -> Infix -> Maybe Builder -> Maybe Builder
forall s.
(Semigroup s, IsString s) =>
WriteCombInh -> Infix -> Maybe s -> Maybe s
pairWriteCombInh WriteCombInh
inh Infix
op (Maybe Builder -> Maybe Builder) -> Maybe Builder -> Maybe Builder
forall a b. (a -> b) -> a -> b
$
      Builder -> Maybe Builder
forall a. a -> Maybe a
Just Builder
"look " Maybe Builder -> Maybe Builder -> Maybe Builder
forall a. Semigroup a => a -> a -> a
<> WriteComb a -> WriteCombInh -> Maybe Builder
forall a. WriteComb a -> WriteCombInh -> Maybe Builder
unWriteComb WriteComb a
x WriteCombInh
inh
    where op :: Infix
op = Precedence -> Infix
infixN Precedence
9
  negLook :: forall a. WriteComb a -> WriteComb ()
negLook WriteComb a
x = (WriteCombInh -> Maybe Builder) -> WriteComb ()
forall a. (WriteCombInh -> Maybe Builder) -> WriteComb a
WriteComb ((WriteCombInh -> Maybe Builder) -> WriteComb ())
-> (WriteCombInh -> Maybe Builder) -> WriteComb ()
forall a b. (a -> b) -> a -> b
$ \WriteCombInh
inh ->
    WriteCombInh -> Infix -> Maybe Builder -> Maybe Builder
forall s.
(Semigroup s, IsString s) =>
WriteCombInh -> Infix -> Maybe s -> Maybe s
pairWriteCombInh WriteCombInh
inh Infix
op (Maybe Builder -> Maybe Builder) -> Maybe Builder -> Maybe Builder
forall a b. (a -> b) -> a -> b
$
      Builder -> Maybe Builder
forall a. a -> Maybe a
Just Builder
"negLook " Maybe Builder -> Maybe Builder -> Maybe Builder
forall a. Semigroup a => a -> a -> a
<> WriteComb a -> WriteCombInh -> Maybe Builder
forall a. WriteComb a -> WriteCombInh -> Maybe Builder
unWriteComb WriteComb a
x WriteCombInh
inh
    where op :: Infix
op = Precedence -> Infix
infixN Precedence
9
  eof :: WriteComb ()
eof = WriteComb ()
"eof"
instance Foldable WriteComb where
  chainPre :: forall a. WriteComb (a -> a) -> WriteComb a -> WriteComb a
chainPre WriteComb (a -> a)
f WriteComb a
x = (WriteCombInh -> Maybe Builder) -> WriteComb a
forall a. (WriteCombInh -> Maybe Builder) -> WriteComb a
WriteComb ((WriteCombInh -> Maybe Builder) -> WriteComb a)
-> (WriteCombInh -> Maybe Builder) -> WriteComb a
forall a b. (a -> b) -> a -> b
$ \WriteCombInh
inh ->
    WriteCombInh -> Infix -> Maybe Builder -> Maybe Builder
forall s.
(Semigroup s, IsString s) =>
WriteCombInh -> Infix -> Maybe s -> Maybe s
pairWriteCombInh WriteCombInh
inh Infix
op (Maybe Builder -> Maybe Builder) -> Maybe Builder -> Maybe Builder
forall a b. (a -> b) -> a -> b
$
      Builder -> Maybe Builder
forall a. a -> Maybe a
Just Builder
"chainPre " Maybe Builder -> Maybe Builder -> Maybe Builder
forall a. Semigroup a => a -> a -> a
<>
      WriteComb (a -> a) -> WriteCombInh -> Maybe Builder
forall a. WriteComb a -> WriteCombInh -> Maybe Builder
unWriteComb WriteComb (a -> a)
f WriteCombInh
inh Maybe Builder -> Maybe Builder -> Maybe Builder
forall a. Semigroup a => a -> a -> a
<> Builder -> Maybe Builder
forall a. a -> Maybe a
Just Builder
" " Maybe Builder -> Maybe Builder -> Maybe Builder
forall a. Semigroup a => a -> a -> a
<>
      WriteComb a -> WriteCombInh -> Maybe Builder
forall a. WriteComb a -> WriteCombInh -> Maybe Builder
unWriteComb WriteComb a
x WriteCombInh
inh
    where op :: Infix
op = Precedence -> Infix
infixN Precedence
9
  chainPost :: forall a. WriteComb a -> WriteComb (a -> a) -> WriteComb a
chainPost WriteComb a
f WriteComb (a -> a)
x = (WriteCombInh -> Maybe Builder) -> WriteComb a
forall a. (WriteCombInh -> Maybe Builder) -> WriteComb a
WriteComb ((WriteCombInh -> Maybe Builder) -> WriteComb a)
-> (WriteCombInh -> Maybe Builder) -> WriteComb a
forall a b. (a -> b) -> a -> b
$ \WriteCombInh
inh ->
    WriteCombInh -> Infix -> Maybe Builder -> Maybe Builder
forall s.
(Semigroup s, IsString s) =>
WriteCombInh -> Infix -> Maybe s -> Maybe s
pairWriteCombInh WriteCombInh
inh Infix
op (Maybe Builder -> Maybe Builder) -> Maybe Builder -> Maybe Builder
forall a b. (a -> b) -> a -> b
$
      Builder -> Maybe Builder
forall a. a -> Maybe a
Just Builder
"chainPost " Maybe Builder -> Maybe Builder -> Maybe Builder
forall a. Semigroup a => a -> a -> a
<>
      WriteComb a -> WriteCombInh -> Maybe Builder
forall a. WriteComb a -> WriteCombInh -> Maybe Builder
unWriteComb WriteComb a
f WriteCombInh
inh Maybe Builder -> Maybe Builder -> Maybe Builder
forall a. Semigroup a => a -> a -> a
<> Builder -> Maybe Builder
forall a. a -> Maybe a
Just Builder
" " Maybe Builder -> Maybe Builder -> Maybe Builder
forall a. Semigroup a => a -> a -> a
<>
      WriteComb (a -> a) -> WriteCombInh -> Maybe Builder
forall a. WriteComb a -> WriteCombInh -> Maybe Builder
unWriteComb WriteComb (a -> a)
x WriteCombInh
inh
    where op :: Infix
op = Precedence -> Infix
infixN Precedence
9