{-# LANGUAGE StandaloneDeriving
  #-}


{-| JSON datatype definition.
 -}


module Text.JSONb.Simple where


import Data.ByteString

import Data.Trie



{-| A monomorphic JSON datatype, backed with 'Rational', strict 'ByteString'
    and 'ByteString' 'Trie'.
 -}
data JSON
  = Object (Trie JSON)
  | Array [JSON]
  | String ByteString
  | Number Rational
  | Boolean Bool
  | Null
deriving instance Eq JSON
instance Show JSON where
  show json                  =  case json of
    Object trie             ->  unlines $ "Object" : trie_show trie
    Array list              ->  unlines $ "Array" : fmap show list
    String bytes            ->  unwords ["String", show bytes]
    Number rational         ->  unwords ["Number", show rational]
    Boolean bool            ->  unwords ["Boolean", show bool]
    Null                    ->  "Null"
   where
    trie_show                =  fmap edge_show . toList
     where
      edge_show (k, v)       =  unwords [show k, "->", show v]