Initial commit.
diff --git a/src/Lambda.hs b/src/Lambda.hs
new file mode 100644
index 0000000..29fce06
--- /dev/null
+++ b/src/Lambda.hs
@@ -0,0 +1,90 @@
+module Lambda ( freeVariables
+              , lambdaArgs
+              , lambdaBody
+              ) where
+
+import Control.Monad
+import Data.Generics.Aliases
+import Data.Generics.Schemes
+import Data.List
+import Language.Haskell.Exts
+------------------------------------------------------------------------------
+import HDevTools
+import Client
+
+------------------------------------------------------------------------------
+freeVariables :: FilePath -> FilePath -> FilePath -> String -> Client -> String -> IO String
+freeVariables srcPath pkgConfigPath cabalFilePath buildTargetName client code = case parseExp code of
+  ParseOk ast -> do
+   names <- dropModuleVariableNames srcPath
+                                    pkgConfigPath
+                                    cabalFilePath
+                                    buildTargetName $ extractFreeVariables ast
+   return . dropCommas $ show names
+  _ -> return "Error parsing freeVars"
+
+------------------------------------------------------------------------------
+lambdaBody ::  String -> String
+lambdaBody code = case parseExp code of
+  ParseOk ast -> show . extractLambdaBody $ ast
+  _           -> "[]"
+
+------------------------------------------------------------------------------
+lambdaArgs :: String -> String
+lambdaArgs code = case parseExp code of
+  ParseOk ast -> extractLambdaArgs ast
+  _           -> "[]"
+
+------------------------------------------------------------------------------
+extractLambdaArgs :: Exp -> String
+extractLambdaArgs (Lambda _ ast _) = dropCommas . show $ allNames ast
+extractLambdaArgs _                = "[]"
+
+------------------------------------------------------------------------------
+allVariables :: GenericQ [Exp]
+allVariables = listify isVar
+
+------------------------------------------------------------------------------
+allBindings :: GenericQ [Pat]
+allBindings = listify isBinding
+
+------------------------------------------------------------------------------
+allNames :: GenericQ [String]
+allNames = everything (++) ([] `mkQ` fmap (: []) getStringFromName)
+
+------------------------------------------------------------------------------
+isVar :: Exp -> Bool
+isVar (Var  _) = True
+isVar  _       = False
+
+------------------------------------------------------------------------------
+isBinding :: Pat -> Bool
+isBinding (PVar _) = True
+isBinding _        = False
+
+------------------------------------------------------------------------------
+getStringFromName :: Name -> String
+getStringFromName (Symbol str) = str
+getStringFromName (Ident str)  = str
+
+------------------------------------------------------------------------------
+dropCommas :: String -> String
+dropCommas = filter (/= ',')
+
+------------------------------------------------------------------------------
+extractLambdaBody :: Exp -> String
+extractLambdaBody (Lambda _ _ ast) = prettyPrint ast
+extractLambdaBody _ = "[]"
+
+------------------------------------------------------------------------------
+extractFreeVariables :: GenericQ [String]
+extractFreeVariables ast = allNames (allVariables ast) \\
+                           allNames (allBindings ast)
+
+------------------------------------------------------------------------------
+dropModuleVariableNames :: FilePath -> FilePath -> FilePath -> String -> [String] -> IO [String]
+dropModuleVariableNames srcPath pkgConfigPath cabalFilePath buildTargetName  =
+  filterM $  (liftM not) .  isInModuleScope srcPath
+                                            pkgConfigPath
+                                            cabalFilePath
+                                            buildTargetName