module Data.Pass.Eval
  ( Eval(..)
  , (@@)
  ) where

import Data.Foldable

infixl 0 @@

class Eval k where
  -- | Run a calculation
  eval :: k a b -> Int -> [a] -> b

(@@) :: (Eval k, Foldable f) => k a b -> f a -> b
k @@ as = eval k (length xs) xs where xs = toList as