module Data.Pass.Calculation
  ( Calculation(..)
  ) where

import Data.Binary
import Data.Monoid
import Data.Typeable
import Data.Pass.Calc
import Data.Pass.Class
import Data.Pass.Eval
import Data.Pass.Fun
import Data.Pass.Thrist
import Data.Pass.Type

class Calculation t where
  calc :: (Eval k, Typeable b, Binary b, Monoid b) => t k a b -> Calc k a b

instance Calculation Fun where
  calc = calc . pass

instance Calculation Thrist where
  calc = calc . pass

instance Calculation Pass where
  calc p = p :& Stop

instance Calculation Calc where
  calc = id