{-# LANGUAGE CPP                 #-}
{-# LANGUAGE GADTs               #-}
{-# LANGUAGE OverloadedStrings   #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE Trustworthy         #-}
#if __GLASGOW_HASKELL__ < 709
{-# OPTIONS_GHC -fcontext-stack=50 #-}
#endif
-- | JSON grammar example.
module RERE.Examples.JSON where

import Prelude hiding (exponent)

import Data.Vec.Lazy (Vec (..))
import Data.Void     (Void)

import qualified Data.Type.Nat as N
import qualified Data.Vec.Lazy as V

import           RERE
import qualified RERE.CharSet as CS

#if !MIN_VERSION_base(4,11,0)
import Data.Semigroup (Semigroup (..))
#endif

-- $setup
-- >>> import RERE

-- | Size of JSON grammar, 22.
type Size = N.Mult2 (N.Plus N.Nat5 N.Nat6)

-- | JSON recursive regular expression constructor from 'jsonCFG'.
--
-- @
-- 'jsonRE'' = 'compact' ('cfgToRE' 'jsonNames' 'jsonCFG')
-- @
--
-- The conversion doesn't optimize the resulting regular expression,
-- but is relatively fast.
--
-- >>> size (cfgToRE jsonNames jsonCFG)
-- 232
--
-- 'jsonRE' is pre-calculated variant.
--
-- >>> size jsonRE
-- 205
--
jsonRE' :: RE Void
jsonRE' :: RE Void
jsonRE' = forall a. Ord a => RE a -> RE a
compact (forall (n :: Nat) a.
(SNatI n, Ord a) =>
Vec ('S n) Name -> CFG ('S n) a -> RE a
cfgToRE Vec Size Name
jsonNames forall a. Ord a => CFG Size a
jsonCFG)

-- | Names of 'jsonCFG' productions.
jsonNames :: Vec Size Name
jsonNames :: Vec Size Name
jsonNames = forall (n :: Nat) a. Vec n a -> Vec n a
V.reverse forall a b. (a -> b) -> a -> b
$
    Name
"json" forall a (n1 :: Nat). a -> Vec n1 a -> Vec ('S n1) a
::: Name
"value" forall a (n1 :: Nat). a -> Vec n1 a -> Vec ('S n1) a
::: Name
"object" forall a (n1 :: Nat). a -> Vec n1 a -> Vec ('S n1) a
::: Name
"members" forall a (n1 :: Nat). a -> Vec n1 a -> Vec ('S n1) a
::: Name
"member" forall a (n1 :: Nat). a -> Vec n1 a -> Vec ('S n1) a
::: Name
"array" forall a (n1 :: Nat). a -> Vec n1 a -> Vec ('S n1) a
::: Name
"elements" forall a (n1 :: Nat). a -> Vec n1 a -> Vec ('S n1) a
::: Name
"element" forall a (n1 :: Nat). a -> Vec n1 a -> Vec ('S n1) a
::: Name
"string" forall a (n1 :: Nat). a -> Vec n1 a -> Vec ('S n1) a
::: Name
"characters" forall a (n1 :: Nat). a -> Vec n1 a -> Vec ('S n1) a
::: Name
"character" forall a (n1 :: Nat). a -> Vec n1 a -> Vec ('S n1) a
::: Name
"escape" forall a (n1 :: Nat). a -> Vec n1 a -> Vec ('S n1) a
::: Name
"hex" forall a (n1 :: Nat). a -> Vec n1 a -> Vec ('S n1) a
::: Name
"number" forall a (n1 :: Nat). a -> Vec n1 a -> Vec ('S n1) a
::: Name
"integer" forall a (n1 :: Nat). a -> Vec n1 a -> Vec ('S n1) a
::: Name
"digits" forall a (n1 :: Nat). a -> Vec n1 a -> Vec ('S n1) a
::: Name
"digit" forall a (n1 :: Nat). a -> Vec n1 a -> Vec ('S n1) a
::: Name
"onenine" forall a (n1 :: Nat). a -> Vec n1 a -> Vec ('S n1) a
::: Name
"fraction" forall a (n1 :: Nat). a -> Vec n1 a -> Vec ('S n1) a
::: Name
"exponent" forall a (n1 :: Nat). a -> Vec n1 a -> Vec ('S n1) a
::: Name
"sign" forall a (n1 :: Nat). a -> Vec n1 a -> Vec ('S n1) a
::: Name
"ws" forall a (n1 :: Nat). a -> Vec n1 a -> Vec ('S n1) a
::: forall a. Vec 'Z a
VNil

-- | JSON grammar
jsonCFG :: forall a. Ord a => CFG Size a
jsonCFG :: forall a. Ord a => CFG Size a
jsonCFG = forall (n :: Nat) a. Vec n a -> Vec n a
V.reverse forall a b. (a -> b) -> a -> b
$
    CFGBase Size a
json forall a (n1 :: Nat). a -> Vec n1 a -> Vec ('S n1) a
::: RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
value forall a (n1 :: Nat). a -> Vec n1 a -> Vec ('S n1) a
::: RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
object forall a (n1 :: Nat). a -> Vec n1 a -> Vec ('S n1) a
::: RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
members forall a (n1 :: Nat). a -> Vec n1 a -> Vec ('S n1) a
::: RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
member forall a (n1 :: Nat). a -> Vec n1 a -> Vec ('S n1) a
::: RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
array forall a (n1 :: Nat). a -> Vec n1 a -> Vec ('S n1) a
::: RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
elements forall a (n1 :: Nat). a -> Vec n1 a -> Vec ('S n1) a
::: RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
element forall a (n1 :: Nat). a -> Vec n1 a -> Vec ('S n1) a
::: RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
string forall a (n1 :: Nat). a -> Vec n1 a -> Vec ('S n1) a
::: RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
characters forall a (n1 :: Nat). a -> Vec n1 a -> Vec ('S n1) a
::: RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
character forall a (n1 :: Nat). a -> Vec n1 a -> Vec ('S n1) a
::: RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
escape forall a (n1 :: Nat). a -> Vec n1 a -> Vec ('S n1) a
::: RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
hex forall a (n1 :: Nat). a -> Vec n1 a -> Vec ('S n1) a
::: RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
number forall a (n1 :: Nat). a -> Vec n1 a -> Vec ('S n1) a
::: RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
integer forall a (n1 :: Nat). a -> Vec n1 a -> Vec ('S n1) a
::: RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
digits forall a (n1 :: Nat). a -> Vec n1 a -> Vec ('S n1) a
::: RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
digit forall a (n1 :: Nat). a -> Vec n1 a -> Vec ('S n1) a
::: forall {a}. RE a
onenine forall a (n1 :: Nat). a -> Vec n1 a -> Vec ('S n1) a
::: RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
fraction forall a (n1 :: Nat). a -> Vec n1 a -> Vec ('S n1) a
::: RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
exponent forall a (n1 :: Nat). a -> Vec n1 a -> Vec ('S n1) a
::: RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
sign forall a (n1 :: Nat). a -> Vec n1 a -> Vec ('S n1) a
::: RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
ws forall a (n1 :: Nat). a -> Vec n1 a -> Vec ('S n1) a
::: forall a. Vec 'Z a
VNil
  where

    _jsonV, valueV, objectV, membersV, memberV, arrayV, elementsV, elementV, stringV, charactersV, characterV, escapeV, hexV, numberV, integerV, digitsV, digitV, onenineV, fractionV, exponentV, signV, wsV :: CFGBase Size a
    _jsonV :: CFGBase Size a
_jsonV      = forall a. a -> RE a
Var forall a b. (a -> b) -> a -> b
$ forall a b. a -> Either a b
Left Fin
  ('S
     ('S
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S ('S ('S ('S ('S ('S ('S ('S 'Z))))))))))))))))))))))
21
    valueV :: CFGBase Size a
valueV      = forall a. a -> RE a
Var forall a b. (a -> b) -> a -> b
$ forall a b. a -> Either a b
Left Fin
  ('S
     ('S
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S ('S ('S ('S ('S ('S ('S ('S 'Z))))))))))))))))))))))
20
    objectV :: CFGBase Size a
objectV     = forall a. a -> RE a
Var forall a b. (a -> b) -> a -> b
$ forall a b. a -> Either a b
Left Fin
  ('S
     ('S
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S ('S ('S ('S ('S ('S ('S ('S 'Z))))))))))))))))))))))
19
    membersV :: CFGBase Size a
membersV    = forall a. a -> RE a
Var forall a b. (a -> b) -> a -> b
$ forall a b. a -> Either a b
Left Fin
  ('S
     ('S
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S ('S ('S ('S ('S ('S ('S ('S 'Z))))))))))))))))))))))
18
    memberV :: CFGBase Size a
memberV     = forall a. a -> RE a
Var forall a b. (a -> b) -> a -> b
$ forall a b. a -> Either a b
Left Fin
  ('S
     ('S
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S ('S ('S ('S ('S ('S ('S ('S 'Z))))))))))))))))))))))
17
    arrayV :: CFGBase Size a
arrayV      = forall a. a -> RE a
Var forall a b. (a -> b) -> a -> b
$ forall a b. a -> Either a b
Left Fin
  ('S
     ('S
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S ('S ('S ('S ('S ('S ('S ('S 'Z))))))))))))))))))))))
16
    elementsV :: CFGBase Size a
elementsV   = forall a. a -> RE a
Var forall a b. (a -> b) -> a -> b
$ forall a b. a -> Either a b
Left Fin
  ('S
     ('S
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S ('S ('S ('S ('S ('S ('S ('S 'Z))))))))))))))))))))))
15
    elementV :: CFGBase Size a
elementV    = forall a. a -> RE a
Var forall a b. (a -> b) -> a -> b
$ forall a b. a -> Either a b
Left Fin
  ('S
     ('S
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S ('S ('S ('S ('S ('S ('S ('S 'Z))))))))))))))))))))))
14
    stringV :: CFGBase Size a
stringV     = forall a. a -> RE a
Var forall a b. (a -> b) -> a -> b
$ forall a b. a -> Either a b
Left Fin
  ('S
     ('S
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S ('S ('S ('S ('S ('S ('S ('S 'Z))))))))))))))))))))))
13
    charactersV :: CFGBase Size a
charactersV = forall a. a -> RE a
Var forall a b. (a -> b) -> a -> b
$ forall a b. a -> Either a b
Left Fin
  ('S
     ('S
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S ('S ('S ('S ('S ('S ('S ('S 'Z))))))))))))))))))))))
12
    characterV :: CFGBase Size a
characterV  = forall a. a -> RE a
Var forall a b. (a -> b) -> a -> b
$ forall a b. a -> Either a b
Left Fin
  ('S
     ('S
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S ('S ('S ('S ('S ('S ('S ('S 'Z))))))))))))))))))))))
11
    escapeV :: CFGBase Size a
escapeV     = forall a. a -> RE a
Var forall a b. (a -> b) -> a -> b
$ forall a b. a -> Either a b
Left Fin
  ('S
     ('S
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S ('S ('S ('S ('S ('S ('S ('S 'Z))))))))))))))))))))))
10
    hexV :: CFGBase Size a
hexV        = forall a. a -> RE a
Var forall a b. (a -> b) -> a -> b
$ forall a b. a -> Either a b
Left Fin
  ('S
     ('S
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S ('S ('S ('S ('S ('S ('S ('S 'Z))))))))))))))))))))))
9
    numberV :: CFGBase Size a
numberV     = forall a. a -> RE a
Var forall a b. (a -> b) -> a -> b
$ forall a b. a -> Either a b
Left Fin
  ('S
     ('S
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S ('S ('S ('S ('S ('S ('S ('S 'Z))))))))))))))))))))))
8
    integerV :: CFGBase Size a
integerV    = forall a. a -> RE a
Var forall a b. (a -> b) -> a -> b
$ forall a b. a -> Either a b
Left Fin
  ('S
     ('S
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S ('S ('S ('S ('S ('S ('S ('S 'Z))))))))))))))))))))))
7
    digitsV :: CFGBase Size a
digitsV     = forall a. a -> RE a
Var forall a b. (a -> b) -> a -> b
$ forall a b. a -> Either a b
Left Fin
  ('S
     ('S
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S ('S ('S ('S ('S ('S ('S ('S 'Z))))))))))))))))))))))
6
    digitV :: CFGBase Size a
digitV      = forall a. a -> RE a
Var forall a b. (a -> b) -> a -> b
$ forall a b. a -> Either a b
Left Fin
  ('S
     ('S
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S ('S ('S ('S ('S ('S ('S ('S 'Z))))))))))))))))))))))
5
    onenineV :: CFGBase Size a
onenineV    = forall a. a -> RE a
Var forall a b. (a -> b) -> a -> b
$ forall a b. a -> Either a b
Left Fin
  ('S
     ('S
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S ('S ('S ('S ('S ('S ('S ('S 'Z))))))))))))))))))))))
4
    fractionV :: CFGBase Size a
fractionV   = forall a. a -> RE a
Var forall a b. (a -> b) -> a -> b
$ forall a b. a -> Either a b
Left Fin
  ('S
     ('S
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S ('S ('S ('S ('S ('S ('S ('S 'Z))))))))))))))))))))))
3
    exponentV :: CFGBase Size a
exponentV   = forall a. a -> RE a
Var forall a b. (a -> b) -> a -> b
$ forall a b. a -> Either a b
Left Fin
  ('S
     ('S
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S ('S ('S ('S ('S ('S ('S ('S 'Z))))))))))))))))))))))
2
    signV :: CFGBase Size a
signV       = forall a. a -> RE a
Var forall a b. (a -> b) -> a -> b
$ forall a b. a -> Either a b
Left Fin
  ('S
     ('S
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S ('S ('S ('S ('S ('S ('S ('S 'Z))))))))))))))))))))))
1
    wsV :: CFGBase Size a
wsV         = forall a. a -> RE a
Var forall a b. (a -> b) -> a -> b
$ forall a b. a -> Either a b
Left Fin
  ('S
     ('S
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S ('S ('S ('S ('S ('S ('S ('S 'Z))))))))))))))))))))))
0

    -- json
    --     element
    --
    json :: CFGBase Size a
json = CFGBase Size a
elementV

    -- value
    --     object
    --     array
    --     string
    --     number
    --     "true"
    --     "false"
    --     "null"
    --
    value :: RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
value = [RE
   (Either
      (Fin
         ('S
            ('S
               ('S
                  ('S
                     ('S
                        ('S
                           ('S
                              ('S
                                 ('S
                                    ('S
                                       ('S
                                          ('S
                                             ('S
                                                ('S
                                                   ('S
                                                      ('S
                                                         ('S
                                                            ('S
                                                               ('S
                                                                  ('S
                                                                     ('S
                                                                        ('S
                                                                           'Z)))))))))))))))))))))))
      a)]
-> RE
     (Either
        (Fin
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S
                                                                          ('S
                                                                             'Z)))))))))))))))))))))))
        a)
unions [ CFGBase Size a
objectV, CFGBase Size a
arrayV, CFGBase Size a
stringV, CFGBase Size a
numberV, RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
"true", RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
"false", RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
"null" ]

    -- object
    --     '{' ws '}'
    --     '{' members '}'
    --
    object :: RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
object = RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
"{" forall a. Semigroup a => a -> a -> a
<> CFGBase Size a
wsV forall a. Semigroup a => a -> a -> a
<> RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
"}" forall a. Ord a => RE a -> RE a -> RE a
\/ RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
"{" forall a. Semigroup a => a -> a -> a
<> CFGBase Size a
membersV forall a. Semigroup a => a -> a -> a
<> RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
"}"

    -- members
    --     member
    --     member ',' members
    --
    members :: RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
members = CFGBase Size a
memberV forall a. Ord a => RE a -> RE a -> RE a
\/ CFGBase Size a
memberV forall a. Semigroup a => a -> a -> a
<> RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
"," forall a. Semigroup a => a -> a -> a
<> CFGBase Size a
membersV

    -- member
    --     ws string ws ':' element
    --
    member :: RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
member = CFGBase Size a
wsV forall a. Semigroup a => a -> a -> a
<> CFGBase Size a
stringV forall a. Semigroup a => a -> a -> a
<> CFGBase Size a
wsV forall a. Semigroup a => a -> a -> a
<> RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
":" forall a. Semigroup a => a -> a -> a
<> CFGBase Size a
elementV

    -- array
    --     '[' ws ']'
    --     '[' elements ']'
    --
    array :: RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
array = RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
"[" forall a. Semigroup a => a -> a -> a
<> CFGBase Size a
wsV forall a. Semigroup a => a -> a -> a
<> RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
"]" forall a. Ord a => RE a -> RE a -> RE a
\/ RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
"[" forall a. Semigroup a => a -> a -> a
<> CFGBase Size a
elementsV forall a. Semigroup a => a -> a -> a
<> RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
"]"

    -- elements
    --     element
    --     element ',' elements
    --
    elements :: RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
elements = CFGBase Size a
elementV forall a. Ord a => RE a -> RE a -> RE a
\/ CFGBase Size a
elementV forall a. Semigroup a => a -> a -> a
<> RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
"," forall a. Semigroup a => a -> a -> a
<> CFGBase Size a
elementsV

    -- element
    --     ws value ws
    --
    element :: RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
element = CFGBase Size a
wsV forall a. Semigroup a => a -> a -> a
<> CFGBase Size a
valueV forall a. Semigroup a => a -> a -> a
<> CFGBase Size a
wsV

    -- string
    --     '"' characters '"'
    --
    string :: RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
string = RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
"\"" forall a. Semigroup a => a -> a -> a
<> CFGBase Size a
charactersV forall a. Semigroup a => a -> a -> a
<> RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
"\""

    -- characters
    --     ""
    --     character characters
    --
    characters :: RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
characters = RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
"" forall a. Ord a => RE a -> RE a -> RE a
\/ CFGBase Size a
characterV forall a. Semigroup a => a -> a -> a
<> CFGBase Size a
charactersV

    -- character
    --     '0020' . '10FFFF' - '"' - '\'
    --     '\' escape
    --
    character :: RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
character = forall a. CharSet -> RE a
Ch CharSet
chars forall a. Ord a => RE a -> RE a -> RE a
\/ RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
"\\" forall a. Semigroup a => a -> a -> a
<> CFGBase Size a
escapeV

    chars :: CharSet
chars = String -> CharSet
CS.fromList [ Char
c | Char
c <- [Char
'\x20' .. forall a. Bounded a => a
maxBound ], Char
c forall a. Eq a => a -> a -> Bool
/= Char
'"', Char
c forall a. Eq a => a -> a -> Bool
/= Char
'\\' ]

    -- escape
    --     '"'
    --     '\'
    --     '/'
    --     'b'
    --     'f'
    --     'n'
    --     'r'
    --     't'
    --     'u' hex hex hex hex
    --
    escape :: RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
escape =
        forall a. CharSet -> RE a
Ch (String -> CharSet
CS.fromList String
"\"\\/bfnrt")
        forall a. Ord a => RE a -> RE a -> RE a
\/ RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
"u" forall a. Semigroup a => a -> a -> a
<> CFGBase Size a
hexV forall a. Semigroup a => a -> a -> a
<> CFGBase Size a
hexV forall a. Semigroup a => a -> a -> a
<> CFGBase Size a
hexV forall a. Semigroup a => a -> a -> a
<> CFGBase Size a
hexV

    -- hex
    --     digit
    --     'A' . 'F'
    --     'a' . 'f'
    hex :: RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
hex = CFGBase Size a
digitV forall a. Semigroup a => a -> a -> a
<> forall a. CharSet -> RE a
Ch (String -> CharSet
CS.fromList String
"ABCDEFabcdef")

    -- number
    --     integer fraction exponent
    --
    number :: RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
number = CFGBase Size a
integerV forall a. Semigroup a => a -> a -> a
<> CFGBase Size a
fractionV forall a. Semigroup a => a -> a -> a
<> CFGBase Size a
exponentV

    -- integer
    --     digit
    --     onenine digits
    --     '-' digit
    --     '-' onenine digits
    --
    integer :: RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
integer = CFGBase Size a
digitV forall a. Ord a => RE a -> RE a -> RE a
\/ CFGBase Size a
onenineV forall a. Semigroup a => a -> a -> a
<> CFGBase Size a
digitsV forall a. Ord a => RE a -> RE a -> RE a
\/ RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
"-" forall a. Semigroup a => a -> a -> a
<> CFGBase Size a
digitV forall a. Ord a => RE a -> RE a -> RE a
\/ RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
"-" forall a. Semigroup a => a -> a -> a
<> CFGBase Size a
onenineV forall a. Semigroup a => a -> a -> a
<> CFGBase Size a
digitsV

    -- digits
    --     digit
    --     digit digits
    --
    digits :: RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
digits = CFGBase Size a
digitV forall a. Ord a => RE a -> RE a -> RE a
\/ CFGBase Size a
digitV forall a. Semigroup a => a -> a -> a
<> CFGBase Size a
digitsV

    -- digit
    --     '0'
    --     onenine
    --
    digit :: RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
digit = RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
"0" forall a. Ord a => RE a -> RE a -> RE a
\/ CFGBase Size a
onenineV

    -- onenine
    --     '1' . '9'
    --
    onenine :: RE a
onenine = forall a. CharSet -> RE a
Ch (String -> CharSet
CS.fromList String
"123456789")

    -- fraction
    --     ""
    -- '.' digits
    --
    fraction :: RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
fraction = RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
"" forall a. Ord a => RE a -> RE a -> RE a
\/ RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
"." forall a. Semigroup a => a -> a -> a
<> CFGBase Size a
digitsV

    -- exponent
    --     ""
    --     'E' sign digits
    --     'e' sign digits
    --
    exponent :: RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
exponent = RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
"" forall a. Ord a => RE a -> RE a -> RE a
\/ RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
"E" forall a. Semigroup a => a -> a -> a
<> CFGBase Size a
signV forall a. Semigroup a => a -> a -> a
<> CFGBase Size a
digitsV forall a. Ord a => RE a -> RE a -> RE a
\/ RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
"e" forall a. Semigroup a => a -> a -> a
<> CFGBase Size a
signV forall a. Semigroup a => a -> a -> a
<> CFGBase Size a
digitsV

    -- sign
    --     ""
    --     '+'
    --     '-'
    --
    sign :: RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
sign = RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
"" forall a. Ord a => RE a -> RE a -> RE a
\/ RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
"+" forall a. Ord a => RE a -> RE a -> RE a
\/ RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
"-"

    -- ws
    --     ""
    --     '0020' ws
    --     '000A' ws
    --     '000D' ws
    --     '0009' ws
    --
    ws :: RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
ws = [RE
   (Either
      (Fin
         ('S
            ('S
               ('S
                  ('S
                     ('S
                        ('S
                           ('S
                              ('S
                                 ('S
                                    ('S
                                       ('S
                                          ('S
                                             ('S
                                                ('S
                                                   ('S
                                                      ('S
                                                         ('S
                                                            ('S
                                                               ('S
                                                                  ('S
                                                                     ('S
                                                                        ('S
                                                                           'Z)))))))))))))))))))))))
      a)]
-> RE
     (Either
        (Fin
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S
                                                                          ('S
                                                                             'Z)))))))))))))))))))))))
        a)
unions [RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
"", RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
"\x20" forall a. Semigroup a => a -> a -> a
<> CFGBase Size a
wsV, RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
"\x0A" forall a. Semigroup a => a -> a -> a
<> CFGBase Size a
wsV, RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
"\x0D" forall a. Semigroup a => a -> a -> a
<> CFGBase Size a
wsV, RE
  (Either
     (Fin
        ('S
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S 'Z)))))))))))))))))))))))
     a)
"\x09" forall a. Semigroup a => a -> a -> a
<> CFGBase Size a
wsV ]

    -- unions
    unions :: [RE
   (Either
      (Fin
         ('S
            ('S
               ('S
                  ('S
                     ('S
                        ('S
                           ('S
                              ('S
                                 ('S
                                    ('S
                                       ('S
                                          ('S
                                             ('S
                                                ('S
                                                   ('S
                                                      ('S
                                                         ('S
                                                            ('S
                                                               ('S
                                                                  ('S
                                                                     ('S
                                                                        ('S
                                                                           'Z)))))))))))))))))))))))
      a)]
-> RE
     (Either
        (Fin
           ('S
              ('S
                 ('S
                    ('S
                       ('S
                          ('S
                             ('S
                                ('S
                                   ('S
                                      ('S
                                         ('S
                                            ('S
                                               ('S
                                                  ('S
                                                     ('S
                                                        ('S
                                                           ('S
                                                              ('S
                                                                 ('S
                                                                    ('S
                                                                       ('S
                                                                          ('S
                                                                             'Z)))))))))))))))))))))))
        a)
unions = forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr forall a. Ord a => RE a -> RE a -> RE a
(\/) forall {a}. RE a
Null

-------------------------------------------------------------------------------
-- Cheat
-------------------------------------------------------------------------------

-- | Pre-calculated JSON grammar as regular expression.
--
-- >>> size jsonRE
-- 205
--
-- See 'jsonRE'' for one constructed from 'jsonCFG'.
--
jsonRE :: RE Void
jsonRE :: RE Void
jsonRE =
    forall a. Name -> RE a -> RE (Var a) -> RE a
Let Name
"ws" (forall a. Name -> RE (Var a) -> RE a
Fix Name
"ws" (forall a. RE a -> RE a -> RE a
Alt forall {a}. RE a
Eps (forall a. RE a -> RE a -> RE a
Alt (forall a. RE a -> RE a -> RE a
App (forall a. CharSet -> RE a
Ch CharSet
" ") (forall a. a -> RE a
Var forall a. Var a
B)) (forall a. RE a -> RE a -> RE a
Alt (forall a. RE a -> RE a -> RE a
App (forall a. CharSet -> RE a
Ch CharSet
"\n") (forall a. a -> RE a
Var forall a. Var a
B)) (forall a. RE a -> RE a -> RE a
Alt (forall a. RE a -> RE a -> RE a
App (forall a. CharSet -> RE a
Ch CharSet
"\r") (forall a. a -> RE a
Var forall a. Var a
B)) (forall a. RE a -> RE a -> RE a
App (forall a. CharSet -> RE a
Ch CharSet
"\t") (forall a. a -> RE a
Var forall a. Var a
B))))))) (forall a. Name -> RE a -> RE (Var a) -> RE a
Let Name
"hex" (forall a. RE a -> RE a -> RE a
App (forall a. CharSet -> RE a
Ch CharSet
"0123456789") (forall a. CharSet -> RE a
Ch CharSet
"ABCDEFabcdef")) (forall a. Name -> RE a -> RE (Var a) -> RE a
Let Name
"escape" (forall a. RE a -> RE a -> RE a
Alt (forall a. CharSet -> RE a
Ch CharSet
"\"/\\bfnrt") (forall a. RE a -> RE a -> RE a
App (forall a. CharSet -> RE a
Ch CharSet
"u") (forall a. RE a -> RE a -> RE a
App (forall a. a -> RE a
Var forall a. Var a
B) (forall a. RE a -> RE a -> RE a
App (forall a. a -> RE a
Var forall a. Var a
B) (forall a. RE a -> RE a -> RE a
App (forall a. a -> RE a
Var forall a. Var a
B) (forall a. a -> RE a
Var forall a. Var a
B)))))) (forall a. Name -> RE a -> RE (Var a) -> RE a
Let Name
"character" (forall a. RE a -> RE a -> RE a
Alt (forall a. CharSet -> RE a
Ch ([(Char, Char)] -> CharSet
CS.fromIntervalList [(Char
'\32',Char
'\33'),(Char
'\35',Char
'\91'),(Char
'\93',Char
'\1114111')])) (forall a. RE a -> RE a -> RE a
App (forall a. CharSet -> RE a
Ch CharSet
"\\") (forall a. a -> RE a
Var forall a. Var a
B))) (forall a. Name -> RE a -> RE (Var a) -> RE a
Let Name
"characters" (forall a. Name -> RE (Var a) -> RE a
Fix Name
"characters" (forall a. RE a -> RE a -> RE a
Alt forall {a}. RE a
Eps (forall a. RE a -> RE a -> RE a
App (forall a. a -> RE a
Var (forall a. a -> Var a
F forall a. Var a
B)) (forall a. a -> RE a
Var forall a. Var a
B)))) (forall a. Name -> RE a -> RE (Var a) -> RE a
Let Name
"string" (forall a. RE a -> RE a -> RE a
App (forall a. CharSet -> RE a
Ch CharSet
"\"") (forall a. RE a -> RE a -> RE a
App (forall a. a -> RE a
Var forall a. Var a
B) (forall a. CharSet -> RE a
Ch CharSet
"\""))) (forall a. Name -> RE a -> RE (Var a) -> RE a
Let Name
"digits" (forall a. Name -> RE (Var a) -> RE a
Fix Name
"digits" (forall a. RE a -> RE a -> RE a
Alt (forall a. CharSet -> RE a
Ch CharSet
"0123456789") (forall a. RE a -> RE a -> RE a
App (forall a. CharSet -> RE a
Ch CharSet
"0123456789") (forall a. a -> RE a
Var forall a. Var a
B)))) (forall a. Name -> RE a -> RE (Var a) -> RE a
Let Name
"integer" (forall a. RE a -> RE a -> RE a
Alt (forall a. CharSet -> RE a
Ch CharSet
"0123456789") (forall a. RE a -> RE a -> RE a
Alt (forall a. RE a -> RE a -> RE a
App (forall a. CharSet -> RE a
Ch CharSet
"123456789") (forall a. a -> RE a
Var forall a. Var a
B)) (forall a. RE a -> RE a -> RE a
Alt (forall a. RE a -> RE a -> RE a
App (forall a. CharSet -> RE a
Ch CharSet
"-") (forall a. CharSet -> RE a
Ch CharSet
"0123456789")) (forall a. RE a -> RE a -> RE a
App (forall a. CharSet -> RE a
Ch CharSet
"-") (forall a. RE a -> RE a -> RE a
App (forall a. CharSet -> RE a
Ch CharSet
"123456789") (forall a. a -> RE a
Var forall a. Var a
B)))))) (forall a. Name -> RE a -> RE (Var a) -> RE a
Let Name
"fraction" (forall a. RE a -> RE a -> RE a
Alt forall {a}. RE a
Eps (forall a. RE a -> RE a -> RE a
App (forall a. CharSet -> RE a
Ch CharSet
".") (forall a. a -> RE a
Var (forall a. a -> Var a
F forall a. Var a
B)))) (forall a. Name -> RE a -> RE (Var a) -> RE a
Let Name
"sign" (forall a. RE a -> RE a -> RE a
Alt forall {a}. RE a
Eps (forall a. CharSet -> RE a
Ch CharSet
"+-")) (forall a. Name -> RE a -> RE (Var a) -> RE a
Let Name
"exponent" (forall a. RE a -> RE a -> RE a
Alt forall {a}. RE a
Eps (forall a. RE a -> RE a -> RE a
Alt (forall a. RE a -> RE a -> RE a
App (forall a. CharSet -> RE a
Ch CharSet
"E") (forall a. RE a -> RE a -> RE a
App (forall a. a -> RE a
Var forall a. Var a
B) (forall a. a -> RE a
Var (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F forall a. Var a
B)))))) (forall a. RE a -> RE a -> RE a
App (forall a. CharSet -> RE a
Ch CharSet
"e") (forall a. RE a -> RE a -> RE a
App (forall a. a -> RE a
Var forall a. Var a
B) (forall a. a -> RE a
Var (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F forall a. Var a
B)))))))) (forall a. Name -> RE a -> RE (Var a) -> RE a
Let Name
"number" (forall a. RE a -> RE a -> RE a
App (forall a. a -> RE a
Var (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F forall a. Var a
B)))) (forall a. RE a -> RE a -> RE a
App (forall a. a -> RE a
Var (forall a. a -> Var a
F (forall a. a -> Var a
F forall a. Var a
B))) (forall a. a -> RE a
Var forall a. Var a
B))) (forall a. Name -> RE a -> RE (Var a) -> RE a
Let Name
"value" (forall a. Name -> RE (Var a) -> RE a
Fix Name
"value" (forall a. Name -> RE a -> RE (Var a) -> RE a
Let Name
"element" (forall a. RE a -> RE a -> RE a
App (forall a. a -> RE a
Var (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F forall a. Var a
B))))))))))))) (forall a. RE a -> RE a -> RE a
App (forall a. a -> RE a
Var forall a. Var a
B) (forall a. a -> RE a
Var (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F forall a. Var a
B))))))))))))))) (forall a. Name -> RE a -> RE (Var a) -> RE a
Let Name
"member" (forall a. RE a -> RE a -> RE a
App (forall a. a -> RE a
Var (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F forall a. Var a
B)))))))))))))) (forall a. RE a -> RE a -> RE a
App (forall a. a -> RE a
Var (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F forall a. Var a
B))))))))) (forall a. RE a -> RE a -> RE a
App (forall a. a -> RE a
Var (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F forall a. Var a
B)))))))))))))) (forall a. RE a -> RE a -> RE a
App (forall a. CharSet -> RE a
Ch CharSet
":") (forall a. a -> RE a
Var forall a. Var a
B))))) (forall a. Name -> RE a -> RE (Var a) -> RE a
Let Name
"members" (forall a. Name -> RE (Var a) -> RE a
Fix Name
"members" (forall a. RE a -> RE a -> RE a
Alt (forall a. a -> RE a
Var (forall a. a -> Var a
F forall a. Var a
B)) (forall a. RE a -> RE a -> RE a
App (forall a. a -> RE a
Var (forall a. a -> Var a
F forall a. Var a
B)) (forall a. RE a -> RE a -> RE a
App (forall a. CharSet -> RE a
Ch CharSet
",") (forall a. a -> RE a
Var forall a. Var a
B))))) (forall a. Name -> RE a -> RE (Var a) -> RE a
Let Name
"object" (forall a. RE a -> RE a -> RE a
Alt (forall a. RE a -> RE a -> RE a
App (forall a. CharSet -> RE a
Ch CharSet
"{") (forall a. RE a -> RE a -> RE a
App (forall a. a -> RE a
Var (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F forall a. Var a
B)))))))))))))))) (forall a. CharSet -> RE a
Ch CharSet
"}"))) (forall a. RE a -> RE a -> RE a
App (forall a. CharSet -> RE a
Ch CharSet
"{") (forall a. RE a -> RE a -> RE a
App (forall a. a -> RE a
Var forall a. Var a
B) (forall a. CharSet -> RE a
Ch CharSet
"}")))) (forall a. Name -> RE a -> RE (Var a) -> RE a
Let Name
"elements" (forall a. Name -> RE (Var a) -> RE a
Fix Name
"elements" (forall a. RE a -> RE a -> RE a
Alt (forall a. a -> RE a
Var (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F forall a. Var a
B))))) (forall a. RE a -> RE a -> RE a
App (forall a. a -> RE a
Var (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F forall a. Var a
B))))) (forall a. RE a -> RE a -> RE a
App (forall a. CharSet -> RE a
Ch CharSet
",") (forall a. a -> RE a
Var forall a. Var a
B))))) (forall a. Name -> RE a -> RE (Var a) -> RE a
Let Name
"array" (forall a. RE a -> RE a -> RE a
Alt (forall a. RE a -> RE a -> RE a
App (forall a. CharSet -> RE a
Ch CharSet
"[") (forall a. RE a -> RE a -> RE a
App (forall a. a -> RE a
Var (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F forall a. Var a
B)))))))))))))))))) (forall a. CharSet -> RE a
Ch CharSet
"]"))) (forall a. RE a -> RE a -> RE a
App (forall a. CharSet -> RE a
Ch CharSet
"[") (forall a. RE a -> RE a -> RE a
App (forall a. a -> RE a
Var forall a. Var a
B) (forall a. CharSet -> RE a
Ch CharSet
"]")))) (forall a. RE a -> RE a -> RE a
Alt (forall a. a -> RE a
Var (forall a. a -> Var a
F (forall a. a -> Var a
F forall a. Var a
B))) (forall a. RE a -> RE a -> RE a
Alt (forall a. a -> RE a
Var forall a. Var a
B) (forall a. RE a -> RE a -> RE a
Alt (forall a. a -> RE a
Var (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F forall a. Var a
B)))))))))))))) (forall a. RE a -> RE a -> RE a
Alt (forall a. a -> RE a
Var (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F forall a. Var a
B)))))))) (forall a. RE a -> RE a -> RE a
Alt (forall a. RE a -> RE a -> RE a
App (forall a. CharSet -> RE a
Ch CharSet
"t") (forall a. RE a -> RE a -> RE a
App (forall a. CharSet -> RE a
Ch CharSet
"r") (forall a. RE a -> RE a -> RE a
App (forall a. CharSet -> RE a
Ch CharSet
"u") (forall a. CharSet -> RE a
Ch CharSet
"e")))) (forall a. RE a -> RE a -> RE a
Alt (forall a. RE a -> RE a -> RE a
App (forall a. CharSet -> RE a
Ch CharSet
"f") (forall a. RE a -> RE a -> RE a
App (forall a. CharSet -> RE a
Ch CharSet
"a") (forall a. RE a -> RE a -> RE a
App (forall a. CharSet -> RE a
Ch CharSet
"l") (forall a. RE a -> RE a -> RE a
App (forall a. CharSet -> RE a
Ch CharSet
"s") (forall a. CharSet -> RE a
Ch CharSet
"e"))))) (forall a. RE a -> RE a -> RE a
App (forall a. CharSet -> RE a
Ch CharSet
"n") (forall a. RE a -> RE a -> RE a
App (forall a. CharSet -> RE a
Ch CharSet
"u") (forall a. RE a -> RE a -> RE a
App (forall a. CharSet -> RE a
Ch CharSet
"l") (forall a. CharSet -> RE a
Ch CharSet
"l"))))))))))))))))) (forall a. RE a -> RE a -> RE a
App (forall a. a -> RE a
Var (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F forall a. Var a
B))))))))))))) (forall a. RE a -> RE a -> RE a
App (forall a. a -> RE a
Var forall a. Var a
B) (forall a. a -> RE a
Var (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F (forall a. a -> Var a
F forall a. Var a
B)))))))))))))))))))))))))))

#ifdef RERE_SLOW_DOCTEST
-- | This are slow tests, take around 90 seconds on my machine
--
-- >>> size jsonRE'
-- 205
--
-- >>> jsonRE == jsonRE'
-- True
--
_doctest1 :: ()
_doctest1 =  ()
#endif