module ADP.Fusion.Term.Edge.Type where import Data.Strict.Tuple import Data.PrimitiveArray import ADP.Fusion.Base data Edge e where Edge :: (Int -> Int -> e) -> Edge e instance Build (Edge e) instance ( Element ls i ) => Element (ls :!: Edge e) i where data Elm (ls :!: Edge e) i = ElmEdge !e !i !i (Elm ls i) type Arg (ls :!: Edge e) = Arg ls :. e getArg (ElmEdge e _ _ ls) = getArg ls :. e getIdx (ElmEdge _ i _ _ ) = i getOmx (ElmEdge _ _ o _ ) = o {-# Inline getArg #-} {-# Inline getIdx #-} {-# Inline getOmx #-} deriving instance (Show i, Show e, Show (Elm ls i)) => Show (Elm (ls :!: Edge e) i) type instance TermArg (TermSymbol a (Edge e)) = TermArg a :. e