module ADP.Fusion.Term.PeekIndex.Type where

import Data.Strict.Tuple

import Data.PrimitiveArray

import ADP.Fusion.Base



data PeekIndex i = PeekIndex

instance Build (PeekIndex i)

instance
  ( Element ls i
  ) => Element (ls :!: PeekIndex i) i where
    data Elm (ls :!: PeekIndex i) i = ElmPeekIndex !i !i !(Elm ls i)
    type Arg (ls :!: PeekIndex i)   = Arg ls :. (i :. i)
    getArg (ElmPeekIndex i o ls)    = getArg ls :. (i:.o)
    getIdx (ElmPeekIndex i _ _ )    = i
    getOmx (ElmPeekIndex _ o _ )    = o
    {-# Inline getArg #-}
    {-# Inline getIdx #-}
    {-# Inline getOmx #-}

deriving instance (Show i, Show (Elm ls i)) => Show (Elm (ls :!: PeekIndex i) i)

type instance TermArg (TermSymbol a (PeekIndex i)) = TermArg a :. PeekIndex i