-- | This file should not be imported directly. Import "Test.OITestGenerator"
--   instead.
module Test.OITestGenerator.GenHelper (
    num_args_name, num_args, typeof
) where

import Prelude
import Language.Haskell.TH
import Control.Applicative
import Control.Monad

num_args_name :: Name -> Q Int
num_args_name name = liftM num_args $ typeof name

num_args :: Type -> Int
num_args (ForallT _ _ tp) = num_args tp
num_args (AppT (AppT ArrowT _) tp) = 1 + num_args tp
num_args _ = 0

typeof_info :: Info -> Type
typeof_info (VarI _ tp _ _)      = tp
typeof_info (ClassOpI _ tp _ _)  = tp
typeof_info (DataConI _ tp _ _)  = tp
typeof_info (TyVarI _ tp)        = tp
typeof_info t = error $ "Failed pattern match in typeof_info.\n"
    ++ "Please file a bug report and attach the following output.\n"
    ++ show t

typeof :: Name -> TypeQ
typeof name = liftM typeof_info $ reify name