-- | 'Switch'es allow enabling and disabling individual rules on a global -- level. -- -- TODO Consider moving the switch status to the type level. -- TODO Consider using patterns for the switch status and encode using @Int@s. module ADP.Fusion.Core.Term.Switch 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 -- | Explicit naming of the status of the switch. data SwitchStatus = Disabled | Enabled deriving (Eq,Ord,Show) -- | Terminal for the switch. The switch status is not given to any function, -- since processing of the rule already indicates that the switch is enabled -- -- if all other symbols parse successfully. Due to consistency, the type of -- result is @()@. data Switch where Switch ∷ !SwitchStatus → Switch instance Build Switch instance ( Element ls i ) => Element (ls :!: Switch) i where data Elm (ls :!: Switch) i = ElmSwitch !(RunningIndex i) !(Elm ls i) type Arg (ls :!: Switch) = Arg ls :. () getArg (ElmSwitch _ ls) = getArg ls :. () getIdx (ElmSwitch i _ ) = i {-# Inline getArg #-} {-# Inline getIdx #-} deriving instance (Show i, Show (RunningIndex i), Show (Elm ls i)) => Show (Elm (ls :!: Switch) i) type instance TermArg Switch = ()