ADPfusion-0.5.2.0: ADP/Fusion/Term/Chr/Type.hs
-- |
--
-- 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.Term.Chr.Type where
import Data.Strict.Tuple
import qualified Data.Vector.Generic as VG
import Data.PrimitiveArray
import ADP.Fusion.Core.Classes
import ADP.Fusion.Core.Multi
-- | A generic Character parser that reads a single character but allows
-- passing additional information.
--
-- 'Chr' expects a function to retrieve @r@ at index position, followed by
-- the actual generic vector with data.
data Chr r x where
Chr :: VG.Vector v x
=> (v x -> Int -> r)
-> !(v x)
-> Chr r x
-- | smart constructor for regular 1-character parsers
chr :: VG.Vector v x => v x -> Chr x x
chr = Chr VG.unsafeIndex
{-# Inline chr #-}
-- | Smart constructor for Maybe Peeking, followed by a character.
chrLeft xs = Chr f xs where
f xs k = ( xs VG.!? (k-1)
, VG.unsafeIndex xs k
)
{-# Inline [0] f #-}
{-# Inline chrLeft #-}
instance Build (Chr r x)
instance
( Element ls i
) => Element (ls :!: Chr r x) i where
data Elm (ls :!: Chr r x) i = ElmChr !r !(RunningIndex i) !(Elm ls i)
type Arg (ls :!: Chr r x) = Arg ls :. r
getArg (ElmChr x _ ls) = getArg ls :. x
getIdx (ElmChr _ i _ ) = i
{-# Inline getArg #-}
{-# Inline getIdx #-}
deriving instance (Show i, Show (RunningIndex i), Show r, Show (Elm ls i)) => Show (Elm (ls :!: Chr r x) i)
type instance TermArg (Chr r x) = r