module Symantic.Base.Routable where

import Data.Eq (Eq)
import Text.Show (Show)

import Symantic.Base.Composable

-- * Class 'Routable'
class Routable repr where
  (<!>) = trans2 (<!>)
  default (<!>) :: Transformable repr => Routable (UnTrans repr) =>
           repr a k -> repr b k -> repr (a:!:b) k
  (<!>) :: repr a k -> repr b k -> repr (a:!:b) k
infixr 3 <!>

-- ** Type (':!:')
-- | Like @(,)@ but @infixr@.
data (:!:) a b = a:!:b
 deriving (Eq,Show)
infixr 3 :!: