packages feed

happy-arbitrary-0.0.1: src/Language/Happy/Ast.hs

{-# LANGUAGE DeriveGeneric     #-}
{-# LANGUAGE DeriveTraversable #-}
{-# LANGUAGE DerivingVia       #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE Strict            #-}
module Language.Happy.Ast
    ( Node, NodeF (..)
    ) where

import           Data.Aeson                   (FromJSON, FromJSON1, ToJSON,
                                               ToJSON1)
import           Data.Fix                     (Fix)
import           Data.Functor.Classes         (Eq1, Ord1, Read1, Show1)
import           Data.Functor.Classes.Generic (FunctorClassesDefault (..))
import           GHC.Generics                 (Generic, Generic1)

data NodeF lexeme a
    = Grammar [lexeme] [a] [a] [lexeme]
    | PragmaExpect lexeme
    | PragmaName lexeme lexeme
    | PragmaErrorHandlerType lexeme
    | PragmaError lexeme
    | PragmaLexer lexeme lexeme
    | PragmaMonad lexeme
    | PragmaTokenType lexeme
    | PragmaToken [a]
    | PragmaLeft [lexeme]
    | PragmaRight [lexeme]
    | Token lexeme lexeme
    | Rule a a
    | RuleType lexeme lexeme
    | RuleDefn lexeme [a]
    | RuleLine [lexeme] lexeme
    deriving (Show, Read, Eq, Ord, Generic, Generic1, Functor, Foldable, Traversable)
    deriving (Show1, Read1, Eq1, Ord1) via FunctorClassesDefault (NodeF lexeme)

type Node lexeme = Fix (NodeF lexeme)

instance FromJSON lexeme => FromJSON1 (NodeF lexeme)
instance ToJSON lexeme => ToJSON1 (NodeF lexeme)