{-# 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
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)
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
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