module Data.Json.Token (JsonToken(..), JsonTokenLike(..)) where

class JsonTokenLike j where
  jsonTokenBraceL     :: j
  jsonTokenBraceR     :: j
  jsonTokenBracketL   :: j
  jsonTokenBracketR   :: j
  jsonTokenComma      :: j
  jsonTokenColon      :: j
  jsonTokenWhitespace :: j
  jsonTokenString     :: String -> j
  jsonTokenBoolean    :: Bool -> j
  jsonTokenNumber     :: Double -> j
  jsonTokenNull       :: j

data JsonToken
  = JsonTokenBraceL
  | JsonTokenBraceR
  | JsonTokenBracketL
  | JsonTokenBracketR
  | JsonTokenComma
  | JsonTokenColon
  | JsonTokenWhitespace
  | JsonTokenString String
  | JsonTokenBoolean Bool
  | JsonTokenNumber Double
  | JsonTokenNull
  deriving (Eq, Show)

instance JsonTokenLike JsonToken where
  jsonTokenBraceL     = JsonTokenBraceL
  jsonTokenBraceR     = JsonTokenBraceR
  jsonTokenBracketL   = JsonTokenBracketL
  jsonTokenBracketR   = JsonTokenBracketR
  jsonTokenComma      = JsonTokenComma
  jsonTokenColon      = JsonTokenColon
  jsonTokenWhitespace = JsonTokenWhitespace
  jsonTokenString     = JsonTokenString
  jsonTokenBoolean    = JsonTokenBoolean
  jsonTokenNumber     = JsonTokenNumber
  jsonTokenNull       = JsonTokenNull