module ADP.Fusion.Term.Chr.Type where
import Data.Strict.Tuple
import qualified Data.Vector.Generic as VG
import Data.PrimitiveArray
import ADP.Fusion.Base
data Chr r x where
Chr :: VG.Vector v x
=> !(v x -> Int -> r)
-> !(v x)
-> Chr r x
chr xs = Chr (VG.unsafeIndex) xs
chrLeft xs = Chr f xs where
f xs k = ( xs VG.!? (k1)
, VG.unsafeIndex xs k
)
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 !i !i !(Elm ls i)
type Arg (ls :!: Chr r x) = Arg ls :. r
getArg (ElmChr x _ _ ls) = getArg ls :. x
getIdx (ElmChr _ i _ _ ) = i
getOmx (ElmChr _ _ o _ ) = o
deriving instance (Show i, Show r, Show (Elm ls i)) => Show (Elm (ls :!: Chr r x) i)
type instance TermArg (TermSymbol a (Chr r x)) = TermArg a :. r