{-# LANGUAGE DeriveGeneric, DeriveAnyClass #-}

-- |
-- This module describes the abstract tree that can be validated by Relapse.
-- The JSON and XML parsers both are both versions of this type class.

module Parsers (
    Tree(..), Label(..)
) where

import Control.DeepSeq (NFData)
import GHC.Generics (Generic)
import Data.Text (Text)
import Data.ByteString (ByteString)

-- |
-- Label is a tagged union of all possible value types that can returned by a katydid parser: 
-- String, Int, Uint, Double, Bool and Bytes.
data Label
    = String Text
    | Int Int
    | Uint Word
    | Double Double
    | Bool Bool
    | Bytes ByteString
    deriving (Show, Eq, Ord, Generic, NFData)

-- |
-- Tree is the type class that should be implemented by a katydid parser.
-- This is implemented by the Json and XML parser.
class Tree a where
    getLabel :: a -> Label
    getChildren :: a -> [a]