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

import Data.Bool (Bool(..))
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 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 'WriteGrammar'
newtype WriteGrammar (showName::Bool) a = WriteGrammar { forall (showName :: Bool) a.
WriteGrammar showName a -> WriteGrammarInh -> Maybe Builder
unWriteGrammar :: WriteGrammarInh -> Maybe TLB.Builder }

instance IsString (WriteGrammar sN a) where
  fromString :: String -> WriteGrammar sN a
fromString String
s = (WriteGrammarInh -> Maybe Builder) -> WriteGrammar sN a
forall (showName :: Bool) a.
(WriteGrammarInh -> Maybe Builder) -> WriteGrammar showName a
WriteGrammar ((WriteGrammarInh -> Maybe Builder) -> WriteGrammar sN a)
-> (WriteGrammarInh -> Maybe Builder) -> WriteGrammar sN a
forall a b. (a -> b) -> a -> b
$ \WriteGrammarInh
_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 'WriteGrammarInh'
data WriteGrammarInh
 =   WriteGrammarInh
 {   WriteGrammarInh -> Builder
writeGrammarInh_indent :: TLB.Builder
 ,   WriteGrammarInh -> (Infix, Side)
writeGrammarInh_op :: (Infix, Side)
 ,   WriteGrammarInh -> Pair
writeGrammarInh_pair :: Pair
 }

emptyWriteGrammarInh :: WriteGrammarInh
emptyWriteGrammarInh :: WriteGrammarInh
emptyWriteGrammarInh = WriteGrammarInh :: Builder -> (Infix, Side) -> Pair -> WriteGrammarInh
WriteGrammarInh
 { writeGrammarInh_indent :: Builder
writeGrammarInh_indent = Builder
"\n"
 , writeGrammarInh_op :: (Infix, Side)
writeGrammarInh_op = (Infix
infixN0, Side
SideL)
 , writeGrammarInh_pair :: Pair
writeGrammarInh_pair = Pair
pairParen
 }

writeGrammar :: WriteGrammar sN a -> TL.Text
writeGrammar :: forall (sN :: Bool) a. WriteGrammar sN a -> Text
writeGrammar (WriteGrammar WriteGrammarInh -> 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
$ WriteGrammarInh -> Maybe Builder
r WriteGrammarInh
emptyWriteGrammarInh

pairWriteGrammarInh ::
 Semigroup s => IsString s =>
 WriteGrammarInh -> Infix -> Maybe s -> Maybe s
pairWriteGrammarInh :: forall s.
(Semigroup s, IsString s) =>
WriteGrammarInh -> Infix -> Maybe s -> Maybe s
pairWriteGrammarInh WriteGrammarInh
inh Infix
op Maybe s
s =
  if (Infix, Side) -> Infix -> Bool
isPairNeeded (WriteGrammarInh -> (Infix, Side)
writeGrammarInh_op WriteGrammarInh
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) = WriteGrammarInh -> Pair
writeGrammarInh_pair WriteGrammarInh
inh

instance
  ShowLetName sN letName =>
  Letable letName (WriteGrammar sN) where
  def :: forall a. letName -> WriteGrammar sN a -> WriteGrammar sN a
def letName
name WriteGrammar sN a
x = (WriteGrammarInh -> Maybe Builder) -> WriteGrammar sN a
forall (showName :: Bool) a.
(WriteGrammarInh -> Maybe Builder) -> WriteGrammar showName a
WriteGrammar ((WriteGrammarInh -> Maybe Builder) -> WriteGrammar sN a)
-> (WriteGrammarInh -> Maybe Builder) -> WriteGrammar sN a
forall a b. (a -> b) -> a -> b
$ \WriteGrammarInh
inh ->
    WriteGrammarInh -> Infix -> Maybe Builder -> Maybe Builder
forall s.
(Semigroup s, IsString s) =>
WriteGrammarInh -> Infix -> Maybe s -> Maybe s
pairWriteGrammarInh WriteGrammarInh
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 (forall (showName :: Bool) letName.
ShowLetName showName letName =>
letName -> String
showLetName @sN letName
name))
      Maybe Builder -> Maybe Builder -> Maybe Builder
forall a. Semigroup a => a -> a -> a
<> WriteGrammar sN a -> WriteGrammarInh -> Maybe Builder
forall (showName :: Bool) a.
WriteGrammar showName a -> WriteGrammarInh -> Maybe Builder
unWriteGrammar WriteGrammar sN a
x WriteGrammarInh
inh
    where
    op :: Infix
op = Precedence -> Infix
infixN Precedence
9
  ref :: forall a. Bool -> letName -> WriteGrammar sN a
ref Bool
rec letName
name = (WriteGrammarInh -> Maybe Builder) -> WriteGrammar sN a
forall (showName :: Bool) a.
(WriteGrammarInh -> Maybe Builder) -> WriteGrammar showName a
WriteGrammar ((WriteGrammarInh -> Maybe Builder) -> WriteGrammar sN a)
-> (WriteGrammarInh -> Maybe Builder) -> WriteGrammar sN a
forall a b. (a -> b) -> a -> b
$ \WriteGrammarInh
inh ->
    WriteGrammarInh -> Infix -> Maybe Builder -> Maybe Builder
forall s.
(Semigroup s, IsString s) =>
WriteGrammarInh -> Infix -> Maybe s -> Maybe s
pairWriteGrammarInh WriteGrammarInh
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 (forall (showName :: Bool) letName.
ShowLetName showName letName =>
letName -> String
showLetName @sN letName
name))
    where
    op :: Infix
op = Precedence -> Infix
infixN Precedence
9
instance Applicable (WriteGrammar sN) where
  pure :: forall a. TermGrammar a -> WriteGrammar sN a
pure TermGrammar a
_ = (WriteGrammarInh -> Maybe Builder) -> WriteGrammar sN a
forall (showName :: Bool) a.
(WriteGrammarInh -> Maybe Builder) -> WriteGrammar showName a
WriteGrammar ((WriteGrammarInh -> Maybe Builder) -> WriteGrammar sN a)
-> (WriteGrammarInh -> Maybe Builder) -> WriteGrammar sN a
forall a b. (a -> b) -> a -> b
$ Maybe Builder -> WriteGrammarInh -> Maybe Builder
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe Builder
forall a. Maybe a
Nothing
  -- pure _ = "pure"
  WriteGrammar WriteGrammarInh -> Maybe Builder
x <*> :: forall a b.
WriteGrammar sN (a -> b) -> WriteGrammar sN a -> WriteGrammar sN b
<*> WriteGrammar WriteGrammarInh -> Maybe Builder
y = (WriteGrammarInh -> Maybe Builder) -> WriteGrammar sN b
forall (showName :: Bool) a.
(WriteGrammarInh -> Maybe Builder) -> WriteGrammar showName a
WriteGrammar ((WriteGrammarInh -> Maybe Builder) -> WriteGrammar sN b)
-> (WriteGrammarInh -> Maybe Builder) -> WriteGrammar sN b
forall a b. (a -> b) -> a -> b
$ \WriteGrammarInh
inh ->
    let inh' :: Side -> WriteGrammarInh
inh' Side
side = WriteGrammarInh
inh
         { writeGrammarInh_op :: (Infix, Side)
writeGrammarInh_op = (Infix
op, Side
side)
         , writeGrammarInh_pair :: Pair
writeGrammarInh_pair = Pair
pairParen
         } in
    case WriteGrammarInh -> Maybe Builder
x (Side -> WriteGrammarInh
inh' Side
SideL) of
     Maybe Builder
Nothing -> WriteGrammarInh -> Maybe Builder
y (Side -> WriteGrammarInh
inh' Side
SideR)
     Just Builder
xt ->
      case WriteGrammarInh -> Maybe Builder
y (Side -> WriteGrammarInh
inh' Side
SideR) of
       Maybe Builder
Nothing -> Builder -> Maybe Builder
forall a. a -> Maybe a
Just Builder
xt
       Just Builder
yt ->
        WriteGrammarInh -> Infix -> Maybe Builder -> Maybe Builder
forall s.
(Semigroup s, IsString s) =>
WriteGrammarInh -> Infix -> Maybe s -> Maybe s
pairWriteGrammarInh WriteGrammarInh
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 (WriteGrammar sN) where
  empty :: forall a. WriteGrammar sN a
empty = WriteGrammar sN a
"empty"
  try :: forall a. WriteGrammar sN a -> WriteGrammar sN a
try WriteGrammar sN a
x = (WriteGrammarInh -> Maybe Builder) -> WriteGrammar sN a
forall (showName :: Bool) a.
(WriteGrammarInh -> Maybe Builder) -> WriteGrammar showName a
WriteGrammar ((WriteGrammarInh -> Maybe Builder) -> WriteGrammar sN a)
-> (WriteGrammarInh -> Maybe Builder) -> WriteGrammar sN a
forall a b. (a -> b) -> a -> b
$ \WriteGrammarInh
inh ->
    WriteGrammarInh -> Infix -> Maybe Builder -> Maybe Builder
forall s.
(Semigroup s, IsString s) =>
WriteGrammarInh -> Infix -> Maybe s -> Maybe s
pairWriteGrammarInh WriteGrammarInh
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
<> WriteGrammar sN a -> WriteGrammarInh -> Maybe Builder
forall (showName :: Bool) a.
WriteGrammar showName a -> WriteGrammarInh -> Maybe Builder
unWriteGrammar WriteGrammar sN a
x WriteGrammarInh
inh
    where
    op :: Infix
op = Precedence -> Infix
infixN Precedence
9
  WriteGrammar sN a
x <|> :: forall a.
WriteGrammar sN a -> WriteGrammar sN a -> WriteGrammar sN a
<|> WriteGrammar sN a
y = (WriteGrammarInh -> Maybe Builder) -> WriteGrammar sN a
forall (showName :: Bool) a.
(WriteGrammarInh -> Maybe Builder) -> WriteGrammar showName a
WriteGrammar ((WriteGrammarInh -> Maybe Builder) -> WriteGrammar sN a)
-> (WriteGrammarInh -> Maybe Builder) -> WriteGrammar sN a
forall a b. (a -> b) -> a -> b
$ \WriteGrammarInh
inh ->
    WriteGrammarInh -> Infix -> Maybe Builder -> Maybe Builder
forall s.
(Semigroup s, IsString s) =>
WriteGrammarInh -> Infix -> Maybe s -> Maybe s
pairWriteGrammarInh WriteGrammarInh
inh Infix
op (Maybe Builder -> Maybe Builder) -> Maybe Builder -> Maybe Builder
forall a b. (a -> b) -> a -> b
$
    WriteGrammar sN a -> WriteGrammarInh -> Maybe Builder
forall (showName :: Bool) a.
WriteGrammar showName a -> WriteGrammarInh -> Maybe Builder
unWriteGrammar WriteGrammar sN a
x WriteGrammarInh
inh
     { writeGrammarInh_op :: (Infix, Side)
writeGrammarInh_op = (Infix
op, Side
SideL)
     , writeGrammarInh_pair :: Pair
writeGrammarInh_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
<>
    WriteGrammar sN a -> WriteGrammarInh -> Maybe Builder
forall (showName :: Bool) a.
WriteGrammar showName a -> WriteGrammarInh -> Maybe Builder
unWriteGrammar WriteGrammar sN a
y WriteGrammarInh
inh
     { writeGrammarInh_op :: (Infix, Side)
writeGrammarInh_op = (Infix
op, Side
SideR)
     , writeGrammarInh_pair :: Pair
writeGrammarInh_pair = Pair
pairParen
     }
    where op :: Infix
op = Side -> Precedence -> Infix
infixB Side
SideL Precedence
3
instance Satisfiable tok (WriteGrammar sN) where
  satisfy :: [ErrorItem tok] -> TermGrammar (tok -> Bool) -> WriteGrammar sN tok
satisfy [ErrorItem tok]
_es TermGrammar (tok -> Bool)
_f = WriteGrammar sN tok
"satisfy"
instance Selectable (WriteGrammar sN) where
  branch :: forall a b c.
WriteGrammar sN (Either a b)
-> WriteGrammar sN (a -> c)
-> WriteGrammar sN (b -> c)
-> WriteGrammar sN c
branch WriteGrammar sN (Either a b)
lr WriteGrammar sN (a -> c)
l WriteGrammar sN (b -> c)
r = (WriteGrammarInh -> Maybe Builder) -> WriteGrammar sN c
forall (showName :: Bool) a.
(WriteGrammarInh -> Maybe Builder) -> WriteGrammar showName a
WriteGrammar ((WriteGrammarInh -> Maybe Builder) -> WriteGrammar sN c)
-> (WriteGrammarInh -> Maybe Builder) -> WriteGrammar sN c
forall a b. (a -> b) -> a -> b
$ \WriteGrammarInh
inh ->
    WriteGrammarInh -> Infix -> Maybe Builder -> Maybe Builder
forall s.
(Semigroup s, IsString s) =>
WriteGrammarInh -> Infix -> Maybe s -> Maybe s
pairWriteGrammarInh WriteGrammarInh
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
<>
      WriteGrammar sN (Either a b) -> WriteGrammarInh -> Maybe Builder
forall (showName :: Bool) a.
WriteGrammar showName a -> WriteGrammarInh -> Maybe Builder
unWriteGrammar WriteGrammar sN (Either a b)
lr WriteGrammarInh
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
<>
      WriteGrammar sN (a -> c) -> WriteGrammarInh -> Maybe Builder
forall (showName :: Bool) a.
WriteGrammar showName a -> WriteGrammarInh -> Maybe Builder
unWriteGrammar WriteGrammar sN (a -> c)
l WriteGrammarInh
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
<>
      WriteGrammar sN (b -> c) -> WriteGrammarInh -> Maybe Builder
forall (showName :: Bool) a.
WriteGrammar showName a -> WriteGrammarInh -> Maybe Builder
unWriteGrammar WriteGrammar sN (b -> c)
r WriteGrammarInh
inh
    where
    op :: Infix
op = Precedence -> Infix
infixN Precedence
9
instance Matchable (WriteGrammar sN) where
  conditional :: forall a b.
Eq a =>
WriteGrammar sN a
-> [TermGrammar (a -> Bool)]
-> [WriteGrammar sN b]
-> WriteGrammar sN b
-> WriteGrammar sN b
conditional WriteGrammar sN a
a [TermGrammar (a -> Bool)]
_ps [WriteGrammar sN b]
bs WriteGrammar sN b
d = (WriteGrammarInh -> Maybe Builder) -> WriteGrammar sN b
forall (showName :: Bool) a.
(WriteGrammarInh -> Maybe Builder) -> WriteGrammar showName a
WriteGrammar ((WriteGrammarInh -> Maybe Builder) -> WriteGrammar sN b)
-> (WriteGrammarInh -> Maybe Builder) -> WriteGrammar sN b
forall a b. (a -> b) -> a -> b
$ \WriteGrammarInh
inh ->
    WriteGrammarInh -> Infix -> Maybe Builder -> Maybe Builder
forall s.
(Semigroup s, IsString s) =>
WriteGrammarInh -> Infix -> Maybe s -> Maybe s
pairWriteGrammarInh WriteGrammarInh
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
<>
      WriteGrammar sN a -> WriteGrammarInh -> Maybe Builder
forall (showName :: Bool) a.
WriteGrammar showName a -> WriteGrammarInh -> Maybe Builder
unWriteGrammar WriteGrammar sN a
a WriteGrammarInh
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
<>
      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
$ ((WriteGrammar sN b -> Maybe Builder)
-> [WriteGrammar sN b] -> [Maybe Builder]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Pre.<$> [WriteGrammar sN b]
bs) ((WriteGrammar sN b -> Maybe Builder) -> [Maybe Builder])
-> (WriteGrammar sN b -> Maybe Builder) -> [Maybe Builder]
forall a b. (a -> b) -> a -> b
$ \WriteGrammar sN b
x ->
        WriteGrammar sN b -> WriteGrammarInh -> Maybe Builder
forall (showName :: Bool) a.
WriteGrammar showName a -> WriteGrammarInh -> Maybe Builder
unWriteGrammar WriteGrammar sN b
x WriteGrammarInh
inh{writeGrammarInh_op :: (Infix, Side)
writeGrammarInh_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
<>
      WriteGrammar sN b -> WriteGrammarInh -> Maybe Builder
forall (showName :: Bool) a.
WriteGrammar showName a -> WriteGrammarInh -> Maybe Builder
unWriteGrammar WriteGrammar sN b
d WriteGrammarInh
inh
    where
    op :: Infix
op = Precedence -> Infix
infixN Precedence
9
instance Lookable (WriteGrammar sN) where
  look :: forall a. WriteGrammar sN a -> WriteGrammar sN a
look WriteGrammar sN a
x = (WriteGrammarInh -> Maybe Builder) -> WriteGrammar sN a
forall (showName :: Bool) a.
(WriteGrammarInh -> Maybe Builder) -> WriteGrammar showName a
WriteGrammar ((WriteGrammarInh -> Maybe Builder) -> WriteGrammar sN a)
-> (WriteGrammarInh -> Maybe Builder) -> WriteGrammar sN a
forall a b. (a -> b) -> a -> b
$ \WriteGrammarInh
inh ->
    WriteGrammarInh -> Infix -> Maybe Builder -> Maybe Builder
forall s.
(Semigroup s, IsString s) =>
WriteGrammarInh -> Infix -> Maybe s -> Maybe s
pairWriteGrammarInh WriteGrammarInh
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
<> WriteGrammar sN a -> WriteGrammarInh -> Maybe Builder
forall (showName :: Bool) a.
WriteGrammar showName a -> WriteGrammarInh -> Maybe Builder
unWriteGrammar WriteGrammar sN a
x WriteGrammarInh
inh
    where op :: Infix
op = Precedence -> Infix
infixN Precedence
9
  negLook :: forall a. WriteGrammar sN a -> WriteGrammar sN ()
negLook WriteGrammar sN a
x = (WriteGrammarInh -> Maybe Builder) -> WriteGrammar sN ()
forall (showName :: Bool) a.
(WriteGrammarInh -> Maybe Builder) -> WriteGrammar showName a
WriteGrammar ((WriteGrammarInh -> Maybe Builder) -> WriteGrammar sN ())
-> (WriteGrammarInh -> Maybe Builder) -> WriteGrammar sN ()
forall a b. (a -> b) -> a -> b
$ \WriteGrammarInh
inh ->
    WriteGrammarInh -> Infix -> Maybe Builder -> Maybe Builder
forall s.
(Semigroup s, IsString s) =>
WriteGrammarInh -> Infix -> Maybe s -> Maybe s
pairWriteGrammarInh WriteGrammarInh
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
<> WriteGrammar sN a -> WriteGrammarInh -> Maybe Builder
forall (showName :: Bool) a.
WriteGrammar showName a -> WriteGrammarInh -> Maybe Builder
unWriteGrammar WriteGrammar sN a
x WriteGrammarInh
inh
    where op :: Infix
op = Precedence -> Infix
infixN Precedence
9
  eof :: WriteGrammar sN ()
eof = WriteGrammar sN ()
"eof"
instance Foldable (WriteGrammar sN) where
  chainPre :: forall a.
WriteGrammar sN (a -> a) -> WriteGrammar sN a -> WriteGrammar sN a
chainPre WriteGrammar sN (a -> a)
f WriteGrammar sN a
x = (WriteGrammarInh -> Maybe Builder) -> WriteGrammar sN a
forall (showName :: Bool) a.
(WriteGrammarInh -> Maybe Builder) -> WriteGrammar showName a
WriteGrammar ((WriteGrammarInh -> Maybe Builder) -> WriteGrammar sN a)
-> (WriteGrammarInh -> Maybe Builder) -> WriteGrammar sN a
forall a b. (a -> b) -> a -> b
$ \WriteGrammarInh
inh ->
    WriteGrammarInh -> Infix -> Maybe Builder -> Maybe Builder
forall s.
(Semigroup s, IsString s) =>
WriteGrammarInh -> Infix -> Maybe s -> Maybe s
pairWriteGrammarInh WriteGrammarInh
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
<>
      WriteGrammar sN (a -> a) -> WriteGrammarInh -> Maybe Builder
forall (showName :: Bool) a.
WriteGrammar showName a -> WriteGrammarInh -> Maybe Builder
unWriteGrammar WriteGrammar sN (a -> a)
f WriteGrammarInh
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
<>
      WriteGrammar sN a -> WriteGrammarInh -> Maybe Builder
forall (showName :: Bool) a.
WriteGrammar showName a -> WriteGrammarInh -> Maybe Builder
unWriteGrammar WriteGrammar sN a
x WriteGrammarInh
inh
    where op :: Infix
op = Precedence -> Infix
infixN Precedence
9
  chainPost :: forall a.
WriteGrammar sN a -> WriteGrammar sN (a -> a) -> WriteGrammar sN a
chainPost WriteGrammar sN a
f WriteGrammar sN (a -> a)
x = (WriteGrammarInh -> Maybe Builder) -> WriteGrammar sN a
forall (showName :: Bool) a.
(WriteGrammarInh -> Maybe Builder) -> WriteGrammar showName a
WriteGrammar ((WriteGrammarInh -> Maybe Builder) -> WriteGrammar sN a)
-> (WriteGrammarInh -> Maybe Builder) -> WriteGrammar sN a
forall a b. (a -> b) -> a -> b
$ \WriteGrammarInh
inh ->
    WriteGrammarInh -> Infix -> Maybe Builder -> Maybe Builder
forall s.
(Semigroup s, IsString s) =>
WriteGrammarInh -> Infix -> Maybe s -> Maybe s
pairWriteGrammarInh WriteGrammarInh
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
<>
      WriteGrammar sN a -> WriteGrammarInh -> Maybe Builder
forall (showName :: Bool) a.
WriteGrammar showName a -> WriteGrammarInh -> Maybe Builder
unWriteGrammar WriteGrammar sN a
f WriteGrammarInh
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
<>
      WriteGrammar sN (a -> a) -> WriteGrammarInh -> Maybe Builder
forall (showName :: Bool) a.
WriteGrammar showName a -> WriteGrammarInh -> Maybe Builder
unWriteGrammar WriteGrammar sN (a -> a)
x WriteGrammarInh
inh
    where op :: Infix
op = Precedence -> Infix
infixN Precedence
9