-- |
--
-- TODO Rename @Chr@ to @Vtx@, a vertex parser is a generalization of
-- a char parser. But this is only semantics, so not super important to do
-- now.

module ADP.Fusion.Core.Term.MultiChr where

import           Data.Strict.Tuple
import           GHC.TypeNats
import qualified Data.Vector.Generic as VG

import           Data.PrimitiveArray

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



-- | A multi-character parser.

data MultiChr (c  Nat) (v  *  *) (x  *) where
  MultiChr  VG.Vector v x
            !(v x)
            MultiChr c v x

-- | smart constructor for regular 1-character parsers

multiChr :: VG.Vector v x => v x -> MultiChr c v x
multiChr = MultiChr
{-# Inline multiChr #-}

instance Build (MultiChr c v x)

instance
  ( Element ls i
  ) => Element (ls :!: MultiChr c v x) i where
    data Elm (ls :!: MultiChr c v x) i = ElmMultiChr !(v x) !(RunningIndex i) !(Elm ls i)
    type Arg (ls :!: MultiChr c v x)   = Arg ls :. v x
    getArg (ElmMultiChr x _ ls) = getArg ls :. x
    getIdx (ElmMultiChr _ i _ ) = i
    {-# Inline getArg #-}
    {-# Inline getIdx #-}

deriving instance (Show i, Show (RunningIndex i), Show (v x), Show (Elm ls i)) => Show (Elm (ls :!: MultiChr c v x) i)

type instance TermArg (MultiChr c v x) = v x