module Language.Lambda.Arbitrary where
import Test.QuickCheck
import Control.Applicative ((<*>), (<$>))
import Data.List
import Language.Lambda.AST
expr_arb :: Gen Expr
expr_arb = gexpr_arb sym_arbitrary
sym_arbitrary :: Gen String
sym_arbitrary = do
index <- suchThat (arbitrary :: Gen Int) (>0)
return $ ("x_" ++ (show index))
gexpr_shrink :: GExpr a -> [GExpr a]
gexpr_shrink x@(Var _) = [x]
gexpr_shrink (App x y) = [x, y]
gexpr_shrink (Lam _ y) = [y]
gexpr_arb :: Gen a -> Gen (GExpr a)
gexpr_arb sym_gen = sized $ \x -> gexpr_arb' x sym_gen
gexpr_arb' :: Int -> Gen s -> Gen (GExpr s)
gexpr_arb' 0 s_arb = Var <$> s_arb
gexpr_arb' n s_arb = do
option <- choose(0, 2) :: Gen Int
case option of
0 -> Var <$> s_arb
1 -> App <$> gexpr_arb' (n 1) s_arb <*> gexpr_arb' (n 1) s_arb
2 -> Lam <$> s_arb <*> gexpr_arb' (n 1) s_arb
_ -> error "choose messed up!"