{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE KindSignatures #-}

module Text.GrammarCombinators.Utils.CombineProcessors (
    CombineFam (Combine)
  , combineProcessors
  ) where

import Text.GrammarCombinators.Base

data CombineFam r1 r2 ix = Combine (r1 ix) (r2 ix)

-- | Combine two semantic processors into a single one that tuples
--   their respective values.
combineProcessors :: forall (phi :: * -> *) rr1 r1 rr2 r2. GProcessor phi rr1 r1 -> GProcessor phi rr2 r2 -> GProcessor phi (CombineFam rr1 rr2) (CombineFam r1 r2)
combineProcessors proc1 proc2 idx (Combine rrv1 rrv2) = Combine (proc1 idx rrv1) (proc2 idx rrv2)