-- | 'Epsilon' is a global or local starting (or ending, depending on the view)
-- point for a grammar.

module ADP.Fusion.Core.Term.Epsilon where

import Data.Data
import Data.Strict.Tuple
import Data.Typeable
import GHC.Generics(Generic)

import Data.PrimitiveArray

import ADP.Fusion.Core.Classes
import ADP.Fusion.Core.Multi



data LocalGlobal = Local | Global
  deriving (Eq,Ord,Read,Show,Data,Typeable,Generic)

data Epsilon (lg  LocalGlobal) = Epsilon

instance Build (Epsilon lg)

instance (Element ls i) => Element (ls :!: Epsilon lg) i where
  data Elm (ls :!: Epsilon lg) i = ElmEpsilon !(RunningIndex i) !(Elm ls i)
  type Arg (ls :!: Epsilon lg)   = Arg ls :. ()
  getArg (ElmEpsilon _ l) = getArg l :. ()
  getIdx (ElmEpsilon i _) = i
  {-# Inline getArg #-}
  {-# Inline getIdx #-}

type instance TermArg (Epsilon lg) = ()