{-|
    Module          : Data.Tree.Parser.Penn.Megaparsec.Internal
    Description     : The internal module for tree parsers
    Copyright       : (c) 2020 Nori Hayashi
    License         : BSD3
    Maintainer      : Nori Hayashi <net@hayashi-lin.net>
    Stability       : experimental
    Portability     : portable
    Language        : Haskell2010
-}

{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE TypeFamilies #-}

module Data.Tree.Parser.Penn.Megaparsec.Internal (
    ParsableAsTerm(..)
) where

import Text.Megaparsec

{-|
    A type class for node label types @term@ 
    data of which can be obtained by parsing a stream of type @str@.
-}
class (Stream str) => ParsableAsTerm str term where
    {-|
        A parser that extracts exactly one token 
        of the node label type @term@ from an input stream of type @str@.
    -}
    pNonTerm :: (Ord err) => ParsecT err str m term
    pTerm :: (Ord err) => ParsecT err str m term

instance (Stream str, Tokens str ~ term)
    => ParsableAsTerm str term where
    pNonTerm = takeRest
    pTerm = takeRest