{-# LANGUAGE FlexibleInstances #-}
module Language.Lambda (
  LambdaExpr(..),
  ParseError(..),
  PrettyPrint(..),
  evalExpr,
  evalString,
  parseExpr,
  uniques,
  ) where

import Control.Monad
import Text.Parsec

import Language.Lambda.Eval
import Language.Lambda.Expression
import Language.Lambda.Parser
import Language.Lambda.Util.PrettyPrint

evalString :: String -> Either ParseError (LambdaExpr String)
evalString = fmap (evalExpr uniques) . parseExpr

uniques :: [String]
uniques = concatMap (\p -> map (:p) . reverse $ ['a'..'z']) suffix
  where suffix = "" : map show [(0::Int)..]