{-# LANGUAGE GADTs #-}
module Language.ASTMonad.Json
  ( module Language.ASTMonad
  , JsonEnvironment(..)
  , JsonStatement(..)
  , JsonM(..)
  , Json(..)
  , is
  , isNum
  , isBool
  , isArray
  ) where

import Language.ASTMonad
import qualified Data.Text.Lazy.IO as TL
import qualified Data.Text.Lazy.Builder as TB
import qualified Data.Text.Lazy.Builder.Int as TB

data JsonEnvironment where
  JsonEnvironment :: JsonEnvironment

data JsonStatement where
  JsonString :: TB.Builder -> TB.Builder -> JsonStatement
  JsonNumber :: (Integral a) => TB.Builder -> a -> JsonStatement
  JsonBool   :: TB.Builder -> Bool -> JsonStatement
  JsonArray  :: TB.Builder -> JsonStatement

type JsonM p a = ASTM p JsonStatement JsonEnvironment a
type Json p = JsonM p ()

is :: TB.Builder -> TB.Builder -> Json p
is x y = fromCode $ \p e -> (e, JsonString x y)

isNum :: (Integral a) => TB.Builder -> a -> Json p
isNum x y = fromCode $ \p e -> (e, JsonNumber x y)

isBool :: TB.Builder -> Bool -> Json p
isBool x y = fromCode $ \p e -> (e, JsonBool x y)

isArray :: TB.Builder -> Json p -> Json p
isArray x y = fromCode' y $ \p e -> (e, JsonArray  x)