This commit is contained in:
jackjohn7 2026-05-14 22:59:58 -05:00
commit 7008596f4c
58 changed files with 1197 additions and 0 deletions

1
.direnv/flake-profile Symbolic link
View file

@ -0,0 +1 @@
flake-profile-2-link

View file

@ -0,0 +1 @@
/nix/store/3i8xg318jhrh3x75952mrjfyqm9gbbjh-ghc-shell-for-lamb-0.1.0.0-0-env

1
.envrc Normal file
View file

@ -0,0 +1 @@
use flake

3
cabal.project Normal file
View file

@ -0,0 +1,3 @@
packages:
.
tests: True

View file

@ -0,0 +1,46 @@
{-# LANGUAGE NoRebindableSyntax #-}
{-# OPTIONS_GHC -Wno-missing-import-lists #-}
{-# OPTIONS_GHC -w #-}
{-|
Module : PackageInfo_example
Description : Contents of some of the package's Cabal file's fields.
WARNING: This module was generated by Cabal. Any modifications will be
overwritten if the module is regenerated.
This module exports values that record information from some of the fields of
the package's Cabal package description file (Cabal file).
For further information about the fields in a Cabal file, see the Cabal User
Guide.
-}
module PackageInfo_example (
name,
version,
synopsis,
copyright,
homepage,
) where
import Data.Version (Version(..))
import Prelude
-- |The content of the @name@ field of the package's Cabal file, but with any
-- hyphen characters replaced by underscore characters.
name :: String
name = "example"
-- |The content of the @version@ field of the package's Cabal file.
version :: Version
version = Version [0,1,0,0] []
-- |The content of the @synopsis@ field of the package's Cabal file.
synopsis :: String
synopsis = ""
-- |The content of the @copyright@ field of the package's Cabal file.
copyright :: String
copyright = ""
-- |The content of the @homepage@ field of the package's Cabal file.
homepage :: String
homepage = ""

View file

@ -0,0 +1,132 @@
{-# LANGUAGE CPP #-}
{-# LANGUAGE NoRebindableSyntax #-}
#if __GLASGOW_HASKELL__ >= 810
{-# OPTIONS_GHC -Wno-prepositive-qualified-module #-}
#endif
{-# OPTIONS_GHC -Wno-missing-import-lists #-}
{-# OPTIONS_GHC -w #-}
{-|
Module : Paths_example
Description : Data file location, and package version and installation
directories.
WARNING: This module was generated by Cabal. Any modifications will be
overwritten if the module is regenerated.
This module exports a function to locate data files, and values that record
the version of the package and some directories which the package has been
configured to be installed into.
For further information about Cabal's options for its configuration step, and
their default values, see the Cabal User Guide.
-}
module Paths_example (
version,
getBinDir, getLibDir, getDynLibDir, getDataDir, getLibexecDir,
getDataFileName, getSysconfDir
) where
import qualified Control.Exception as Exception
import Data.Version (Version(..))
import System.Environment (getEnv)
import Prelude
#if defined(VERSION_base)
#if MIN_VERSION_base(4,0,0)
catchIO :: IO a -> (Exception.IOException -> IO a) -> IO a
#else
catchIO :: IO a -> (Exception.Exception -> IO a) -> IO a
#endif
#else
catchIO :: IO a -> (Exception.IOException -> IO a) -> IO a
#endif
catchIO = Exception.catch
-- |The package version.
version :: Version
version = Version [0,1,0,0] []
-- |If the argument is a filename, the result is the name of a corresponding
-- file on the system on which the program is running, if the file were listed
-- in the @data-files@ field of the package's Cabal package description file.
-- No check is performed that the given filename is listed in that field.
getDataFileName :: FilePath -> IO FilePath
getDataFileName name = do
dir <- getDataDir
return (dir `joinFileName` name)
-- |The location of the directory specified by Cabal's @--bindir@ option (where
-- executables that the user might invoke are installed). This can be overridden
-- at runtime using the environment variable example_bindir.
getBinDir :: IO FilePath
-- |The location of the directory specified by Cabal's @--libdir@ option (where
-- object libraries are installed). This can be overridden at runtime using the
-- environment variable example_libdir.
getLibDir :: IO FilePath
-- |The location of the directory specified by Cabal's @--dynlibdir@ option
-- (where dynamic libraries are installed). This can be overridden at runtime
-- using the environment variable example_dynlibdir.
getDynLibDir :: IO FilePath
-- |The location of the directory specified by Cabal's @--datadir@ option (where
-- architecture-independent data files are installed). This can be overridden at
-- runtime using the environment variable example_datadir.
getDataDir :: IO FilePath
-- |The location of the directory specified by Cabal's @--libexedir@ option
-- (where executables that are not expected to be invoked directly by the user
-- are installed). This can be overridden at runtime using the environment
-- variable example_libexedir.
getLibexecDir :: IO FilePath
-- |The location of the directory specified by Cabal's @--sysconfdir@ option
-- (where configuration files are installed). This can be overridden at runtime
-- using the environment variable example_sysconfdir.
getSysconfDir :: IO FilePath
bindir, libdir, dynlibdir, datadir, libexecdir, sysconfdir :: FilePath
bindir = "/home/jingus/.cabal/bin"
libdir = "/home/jingus/.cabal/lib/x86_64-linux-ghc-9.10.3-c0c3/example-0.1.0.0-inplace-example"
dynlibdir = "/home/jingus/.cabal/lib/x86_64-linux-ghc-9.10.3-c0c3"
datadir = "/home/jingus/.cabal/share/x86_64-linux-ghc-9.10.3-c0c3/example-0.1.0.0"
libexecdir = "/home/jingus/.cabal/libexec/x86_64-linux-ghc-9.10.3-c0c3/example-0.1.0.0"
sysconfdir = "/home/jingus/.cabal/etc"
getBinDir = catchIO (getEnv "example_bindir") (\_ -> return bindir)
getLibDir = catchIO (getEnv "example_libdir") (\_ -> return libdir)
getDynLibDir = catchIO (getEnv "example_dynlibdir") (\_ -> return dynlibdir)
getDataDir = catchIO (getEnv "example_datadir") (\_ -> return datadir)
getLibexecDir = catchIO (getEnv "example_libexecdir") (\_ -> return libexecdir)
getSysconfDir = catchIO (getEnv "example_sysconfdir") (\_ -> return sysconfdir)
joinFileName :: String -> String -> FilePath
joinFileName "" fname = fname
joinFileName "." fname = fname
joinFileName dir "" = dir
joinFileName dir@(c:cs) fname
| isPathSeparator (lastChar c cs) = dir ++ fname
| otherwise = dir ++ pathSeparator : fname
where
-- We do not use Data.List.NonEmpty.last, as that would limit the module to
-- base >= 4.9.0.0 (GHC >= 8.0.1).
lastChar x [] = x
lastChar _ (x:xs) = lastChar x xs
pathSeparator :: Char
pathSeparator = '/'
isPathSeparator :: Char -> Bool
isPathSeparator c = c == '/'

View file

@ -0,0 +1,140 @@
/* DO NOT EDIT: This file is automatically generated by Cabal */
/* package example-0.1.0.0 */
#ifndef VERSION_example
#define VERSION_example "0.1.0.0"
#endif /* VERSION_example */
#ifndef MIN_VERSION_example
#define MIN_VERSION_example(major1,major2,minor) (\
(major1) < 0 || \
(major1) == 0 && (major2) < 1 || \
(major1) == 0 && (major2) == 1 && (minor) <= 0)
#endif /* MIN_VERSION_example */
/* package base-4.20.2.0 */
#ifndef VERSION_base
#define VERSION_base "4.20.2.0"
#endif /* VERSION_base */
#ifndef MIN_VERSION_base
#define MIN_VERSION_base(major1,major2,minor) (\
(major1) < 4 || \
(major1) == 4 && (major2) < 20 || \
(major1) == 4 && (major2) == 20 && (minor) <= 2)
#endif /* MIN_VERSION_base */
/* tool cpphs-1.20.9 */
#ifndef TOOL_VERSION_cpphs
#define TOOL_VERSION_cpphs "1.20.9"
#endif /* TOOL_VERSION_cpphs */
#ifndef MIN_TOOL_VERSION_cpphs
#define MIN_TOOL_VERSION_cpphs(major1,major2,minor) (\
(major1) < 1 || \
(major1) == 1 && (major2) < 20 || \
(major1) == 1 && (major2) == 20 && (minor) <= 9)
#endif /* MIN_TOOL_VERSION_cpphs */
/* tool gcc-15.2.0 */
#ifndef TOOL_VERSION_gcc
#define TOOL_VERSION_gcc "15.2.0"
#endif /* TOOL_VERSION_gcc */
#ifndef MIN_TOOL_VERSION_gcc
#define MIN_TOOL_VERSION_gcc(major1,major2,minor) (\
(major1) < 15 || \
(major1) == 15 && (major2) < 2 || \
(major1) == 15 && (major2) == 2 && (minor) <= 0)
#endif /* MIN_TOOL_VERSION_gcc */
/* tool ghc-9.10.3 */
#ifndef TOOL_VERSION_ghc
#define TOOL_VERSION_ghc "9.10.3"
#endif /* TOOL_VERSION_ghc */
#ifndef MIN_TOOL_VERSION_ghc
#define MIN_TOOL_VERSION_ghc(major1,major2,minor) (\
(major1) < 9 || \
(major1) == 9 && (major2) < 10 || \
(major1) == 9 && (major2) == 10 && (minor) <= 3)
#endif /* MIN_TOOL_VERSION_ghc */
/* tool ghc-pkg-9.10.3 */
#ifndef TOOL_VERSION_ghc_pkg
#define TOOL_VERSION_ghc_pkg "9.10.3"
#endif /* TOOL_VERSION_ghc_pkg */
#ifndef MIN_TOOL_VERSION_ghc_pkg
#define MIN_TOOL_VERSION_ghc_pkg(major1,major2,minor) (\
(major1) < 9 || \
(major1) == 9 && (major2) < 10 || \
(major1) == 9 && (major2) == 10 && (minor) <= 3)
#endif /* MIN_TOOL_VERSION_ghc_pkg */
/* tool gpp-15.2.0 */
#ifndef TOOL_VERSION_gpp
#define TOOL_VERSION_gpp "15.2.0"
#endif /* TOOL_VERSION_gpp */
#ifndef MIN_TOOL_VERSION_gpp
#define MIN_TOOL_VERSION_gpp(major1,major2,minor) (\
(major1) < 15 || \
(major1) == 15 && (major2) < 2 || \
(major1) == 15 && (major2) == 2 && (minor) <= 0)
#endif /* MIN_TOOL_VERSION_gpp */
/* tool haddock-2.31.1 */
#ifndef TOOL_VERSION_haddock
#define TOOL_VERSION_haddock "2.31.1"
#endif /* TOOL_VERSION_haddock */
#ifndef MIN_TOOL_VERSION_haddock
#define MIN_TOOL_VERSION_haddock(major1,major2,minor) (\
(major1) < 2 || \
(major1) == 2 && (major2) < 31 || \
(major1) == 2 && (major2) == 31 && (minor) <= 1)
#endif /* MIN_TOOL_VERSION_haddock */
/* tool hpc-0.69 */
#ifndef TOOL_VERSION_hpc
#define TOOL_VERSION_hpc "0.69"
#endif /* TOOL_VERSION_hpc */
#ifndef MIN_TOOL_VERSION_hpc
#define MIN_TOOL_VERSION_hpc(major1,major2,minor) (\
(major1) < 0 || \
(major1) == 0 && (major2) < 69 || \
(major1) == 0 && (major2) == 69 && (minor) <= 0)
#endif /* MIN_TOOL_VERSION_hpc */
/* tool hsc2hs-0.68.10 */
#ifndef TOOL_VERSION_hsc2hs
#define TOOL_VERSION_hsc2hs "0.68.10"
#endif /* TOOL_VERSION_hsc2hs */
#ifndef MIN_TOOL_VERSION_hsc2hs
#define MIN_TOOL_VERSION_hsc2hs(major1,major2,minor) (\
(major1) < 0 || \
(major1) == 0 && (major2) < 68 || \
(major1) == 0 && (major2) == 68 && (minor) <= 10)
#endif /* MIN_TOOL_VERSION_hsc2hs */
/* tool hscolour-1.25 */
#ifndef TOOL_VERSION_hscolour
#define TOOL_VERSION_hscolour "1.25"
#endif /* TOOL_VERSION_hscolour */
#ifndef MIN_TOOL_VERSION_hscolour
#define MIN_TOOL_VERSION_hscolour(major1,major2,minor) (\
(major1) < 1 || \
(major1) == 1 && (major2) < 25 || \
(major1) == 1 && (major2) == 25 && (minor) <= 0)
#endif /* MIN_TOOL_VERSION_hscolour */
/* tool runghc-9.10.3 */
#ifndef TOOL_VERSION_runghc
#define TOOL_VERSION_runghc "9.10.3"
#endif /* TOOL_VERSION_runghc */
#ifndef MIN_TOOL_VERSION_runghc
#define MIN_TOOL_VERSION_runghc(major1,major2,minor) (\
(major1) < 9 || \
(major1) == 9 && (major2) < 10 || \
(major1) == 9 && (major2) == 10 && (minor) <= 3)
#endif /* MIN_TOOL_VERSION_runghc */
/* tool strip-2.46 */
#ifndef TOOL_VERSION_strip
#define TOOL_VERSION_strip "2.46"
#endif /* TOOL_VERSION_strip */
#ifndef MIN_TOOL_VERSION_strip
#define MIN_TOOL_VERSION_strip(major1,major2,minor) (\
(major1) < 2 || \
(major1) == 2 && (major2) < 46 || \
(major1) == 2 && (major2) == 46 && (minor) <= 0)
#endif /* MIN_TOOL_VERSION_strip */
#ifndef CURRENT_COMPONENT_ID
#define CURRENT_COMPONENT_ID "example-0.1.0.0-inplace-example"
#endif /* CURRENT_COMPONENT_ID */
#ifndef CURRENT_PACKAGE_VERSION
#define CURRENT_PACKAGE_VERSION "0.1.0.0"
#endif /* CURRENT_PACKAGE_VERSION */

View file

@ -0,0 +1,46 @@
{-# LANGUAGE NoRebindableSyntax #-}
{-# OPTIONS_GHC -Wno-missing-import-lists #-}
{-# OPTIONS_GHC -w #-}
{-|
Module : PackageInfo_lamb
Description : Contents of some of the package's Cabal file's fields.
WARNING: This module was generated by Cabal. Any modifications will be
overwritten if the module is regenerated.
This module exports values that record information from some of the fields of
the package's Cabal package description file (Cabal file).
For further information about the fields in a Cabal file, see the Cabal User
Guide.
-}
module PackageInfo_lamb (
name,
version,
synopsis,
copyright,
homepage,
) where
import Data.Version (Version(..))
import Prelude
-- |The content of the @name@ field of the package's Cabal file, but with any
-- hyphen characters replaced by underscore characters.
name :: String
name = "lamb"
-- |The content of the @version@ field of the package's Cabal file.
version :: Version
version = Version [0,1,0,0] []
-- |The content of the @synopsis@ field of the package's Cabal file.
synopsis :: String
synopsis = ""
-- |The content of the @copyright@ field of the package's Cabal file.
copyright :: String
copyright = ""
-- |The content of the @homepage@ field of the package's Cabal file.
homepage :: String
homepage = ""

View file

@ -0,0 +1,132 @@
{-# LANGUAGE CPP #-}
{-# LANGUAGE NoRebindableSyntax #-}
#if __GLASGOW_HASKELL__ >= 810
{-# OPTIONS_GHC -Wno-prepositive-qualified-module #-}
#endif
{-# OPTIONS_GHC -Wno-missing-import-lists #-}
{-# OPTIONS_GHC -w #-}
{-|
Module : Paths_lamb
Description : Data file location, and package version and installation
directories.
WARNING: This module was generated by Cabal. Any modifications will be
overwritten if the module is regenerated.
This module exports a function to locate data files, and values that record
the version of the package and some directories which the package has been
configured to be installed into.
For further information about Cabal's options for its configuration step, and
their default values, see the Cabal User Guide.
-}
module Paths_lamb (
version,
getBinDir, getLibDir, getDynLibDir, getDataDir, getLibexecDir,
getDataFileName, getSysconfDir
) where
import qualified Control.Exception as Exception
import Data.Version (Version(..))
import System.Environment (getEnv)
import Prelude
#if defined(VERSION_base)
#if MIN_VERSION_base(4,0,0)
catchIO :: IO a -> (Exception.IOException -> IO a) -> IO a
#else
catchIO :: IO a -> (Exception.Exception -> IO a) -> IO a
#endif
#else
catchIO :: IO a -> (Exception.IOException -> IO a) -> IO a
#endif
catchIO = Exception.catch
-- |The package version.
version :: Version
version = Version [0,1,0,0] []
-- |If the argument is a filename, the result is the name of a corresponding
-- file on the system on which the program is running, if the file were listed
-- in the @data-files@ field of the package's Cabal package description file.
-- No check is performed that the given filename is listed in that field.
getDataFileName :: FilePath -> IO FilePath
getDataFileName name = do
dir <- getDataDir
return (dir `joinFileName` name)
-- |The location of the directory specified by Cabal's @--bindir@ option (where
-- executables that the user might invoke are installed). This can be overridden
-- at runtime using the environment variable lamb_bindir.
getBinDir :: IO FilePath
-- |The location of the directory specified by Cabal's @--libdir@ option (where
-- object libraries are installed). This can be overridden at runtime using the
-- environment variable lamb_libdir.
getLibDir :: IO FilePath
-- |The location of the directory specified by Cabal's @--dynlibdir@ option
-- (where dynamic libraries are installed). This can be overridden at runtime
-- using the environment variable lamb_dynlibdir.
getDynLibDir :: IO FilePath
-- |The location of the directory specified by Cabal's @--datadir@ option (where
-- architecture-independent data files are installed). This can be overridden at
-- runtime using the environment variable lamb_datadir.
getDataDir :: IO FilePath
-- |The location of the directory specified by Cabal's @--libexedir@ option
-- (where executables that are not expected to be invoked directly by the user
-- are installed). This can be overridden at runtime using the environment
-- variable lamb_libexedir.
getLibexecDir :: IO FilePath
-- |The location of the directory specified by Cabal's @--sysconfdir@ option
-- (where configuration files are installed). This can be overridden at runtime
-- using the environment variable lamb_sysconfdir.
getSysconfDir :: IO FilePath
bindir, libdir, dynlibdir, datadir, libexecdir, sysconfdir :: FilePath
bindir = "/home/jingus/.cabal/bin"
libdir = "/home/jingus/.cabal/lib/x86_64-linux-ghc-9.10.3-c0c3/lamb-0.1.0.0-inplace-lamb-tests"
dynlibdir = "/home/jingus/.cabal/lib/x86_64-linux-ghc-9.10.3-c0c3"
datadir = "/home/jingus/.cabal/share/x86_64-linux-ghc-9.10.3-c0c3/lamb-0.1.0.0"
libexecdir = "/home/jingus/.cabal/libexec/x86_64-linux-ghc-9.10.3-c0c3/lamb-0.1.0.0"
sysconfdir = "/home/jingus/.cabal/etc"
getBinDir = catchIO (getEnv "lamb_bindir") (\_ -> return bindir)
getLibDir = catchIO (getEnv "lamb_libdir") (\_ -> return libdir)
getDynLibDir = catchIO (getEnv "lamb_dynlibdir") (\_ -> return dynlibdir)
getDataDir = catchIO (getEnv "lamb_datadir") (\_ -> return datadir)
getLibexecDir = catchIO (getEnv "lamb_libexecdir") (\_ -> return libexecdir)
getSysconfDir = catchIO (getEnv "lamb_sysconfdir") (\_ -> return sysconfdir)
joinFileName :: String -> String -> FilePath
joinFileName "" fname = fname
joinFileName "." fname = fname
joinFileName dir "" = dir
joinFileName dir@(c:cs) fname
| isPathSeparator (lastChar c cs) = dir ++ fname
| otherwise = dir ++ pathSeparator : fname
where
-- We do not use Data.List.NonEmpty.last, as that would limit the module to
-- base >= 4.9.0.0 (GHC >= 8.0.1).
lastChar x [] = x
lastChar _ (x:xs) = lastChar x xs
pathSeparator :: Char
pathSeparator = '/'
isPathSeparator :: Char -> Bool
isPathSeparator c = c == '/'

View file

@ -0,0 +1,150 @@
/* DO NOT EDIT: This file is automatically generated by Cabal */
/* package lamb-0.1.0.0 */
#ifndef VERSION_lamb
#define VERSION_lamb "0.1.0.0"
#endif /* VERSION_lamb */
#ifndef MIN_VERSION_lamb
#define MIN_VERSION_lamb(major1,major2,minor) (\
(major1) < 0 || \
(major1) == 0 && (major2) < 1 || \
(major1) == 0 && (major2) == 1 && (minor) <= 0)
#endif /* MIN_VERSION_lamb */
/* package base-4.20.2.0 */
#ifndef VERSION_base
#define VERSION_base "4.20.2.0"
#endif /* VERSION_base */
#ifndef MIN_VERSION_base
#define MIN_VERSION_base(major1,major2,minor) (\
(major1) < 4 || \
(major1) == 4 && (major2) < 20 || \
(major1) == 4 && (major2) == 20 && (minor) <= 2)
#endif /* MIN_VERSION_base */
/* package hspec-2.11.17 */
#ifndef VERSION_hspec
#define VERSION_hspec "2.11.17"
#endif /* VERSION_hspec */
#ifndef MIN_VERSION_hspec
#define MIN_VERSION_hspec(major1,major2,minor) (\
(major1) < 2 || \
(major1) == 2 && (major2) < 11 || \
(major1) == 2 && (major2) == 11 && (minor) <= 17)
#endif /* MIN_VERSION_hspec */
/* tool cpphs-1.20.9 */
#ifndef TOOL_VERSION_cpphs
#define TOOL_VERSION_cpphs "1.20.9"
#endif /* TOOL_VERSION_cpphs */
#ifndef MIN_TOOL_VERSION_cpphs
#define MIN_TOOL_VERSION_cpphs(major1,major2,minor) (\
(major1) < 1 || \
(major1) == 1 && (major2) < 20 || \
(major1) == 1 && (major2) == 20 && (minor) <= 9)
#endif /* MIN_TOOL_VERSION_cpphs */
/* tool gcc-15.2.0 */
#ifndef TOOL_VERSION_gcc
#define TOOL_VERSION_gcc "15.2.0"
#endif /* TOOL_VERSION_gcc */
#ifndef MIN_TOOL_VERSION_gcc
#define MIN_TOOL_VERSION_gcc(major1,major2,minor) (\
(major1) < 15 || \
(major1) == 15 && (major2) < 2 || \
(major1) == 15 && (major2) == 2 && (minor) <= 0)
#endif /* MIN_TOOL_VERSION_gcc */
/* tool ghc-9.10.3 */
#ifndef TOOL_VERSION_ghc
#define TOOL_VERSION_ghc "9.10.3"
#endif /* TOOL_VERSION_ghc */
#ifndef MIN_TOOL_VERSION_ghc
#define MIN_TOOL_VERSION_ghc(major1,major2,minor) (\
(major1) < 9 || \
(major1) == 9 && (major2) < 10 || \
(major1) == 9 && (major2) == 10 && (minor) <= 3)
#endif /* MIN_TOOL_VERSION_ghc */
/* tool ghc-pkg-9.10.3 */
#ifndef TOOL_VERSION_ghc_pkg
#define TOOL_VERSION_ghc_pkg "9.10.3"
#endif /* TOOL_VERSION_ghc_pkg */
#ifndef MIN_TOOL_VERSION_ghc_pkg
#define MIN_TOOL_VERSION_ghc_pkg(major1,major2,minor) (\
(major1) < 9 || \
(major1) == 9 && (major2) < 10 || \
(major1) == 9 && (major2) == 10 && (minor) <= 3)
#endif /* MIN_TOOL_VERSION_ghc_pkg */
/* tool gpp-15.2.0 */
#ifndef TOOL_VERSION_gpp
#define TOOL_VERSION_gpp "15.2.0"
#endif /* TOOL_VERSION_gpp */
#ifndef MIN_TOOL_VERSION_gpp
#define MIN_TOOL_VERSION_gpp(major1,major2,minor) (\
(major1) < 15 || \
(major1) == 15 && (major2) < 2 || \
(major1) == 15 && (major2) == 2 && (minor) <= 0)
#endif /* MIN_TOOL_VERSION_gpp */
/* tool haddock-2.31.1 */
#ifndef TOOL_VERSION_haddock
#define TOOL_VERSION_haddock "2.31.1"
#endif /* TOOL_VERSION_haddock */
#ifndef MIN_TOOL_VERSION_haddock
#define MIN_TOOL_VERSION_haddock(major1,major2,minor) (\
(major1) < 2 || \
(major1) == 2 && (major2) < 31 || \
(major1) == 2 && (major2) == 31 && (minor) <= 1)
#endif /* MIN_TOOL_VERSION_haddock */
/* tool hpc-0.69 */
#ifndef TOOL_VERSION_hpc
#define TOOL_VERSION_hpc "0.69"
#endif /* TOOL_VERSION_hpc */
#ifndef MIN_TOOL_VERSION_hpc
#define MIN_TOOL_VERSION_hpc(major1,major2,minor) (\
(major1) < 0 || \
(major1) == 0 && (major2) < 69 || \
(major1) == 0 && (major2) == 69 && (minor) <= 0)
#endif /* MIN_TOOL_VERSION_hpc */
/* tool hsc2hs-0.68.10 */
#ifndef TOOL_VERSION_hsc2hs
#define TOOL_VERSION_hsc2hs "0.68.10"
#endif /* TOOL_VERSION_hsc2hs */
#ifndef MIN_TOOL_VERSION_hsc2hs
#define MIN_TOOL_VERSION_hsc2hs(major1,major2,minor) (\
(major1) < 0 || \
(major1) == 0 && (major2) < 68 || \
(major1) == 0 && (major2) == 68 && (minor) <= 10)
#endif /* MIN_TOOL_VERSION_hsc2hs */
/* tool hscolour-1.25 */
#ifndef TOOL_VERSION_hscolour
#define TOOL_VERSION_hscolour "1.25"
#endif /* TOOL_VERSION_hscolour */
#ifndef MIN_TOOL_VERSION_hscolour
#define MIN_TOOL_VERSION_hscolour(major1,major2,minor) (\
(major1) < 1 || \
(major1) == 1 && (major2) < 25 || \
(major1) == 1 && (major2) == 25 && (minor) <= 0)
#endif /* MIN_TOOL_VERSION_hscolour */
/* tool runghc-9.10.3 */
#ifndef TOOL_VERSION_runghc
#define TOOL_VERSION_runghc "9.10.3"
#endif /* TOOL_VERSION_runghc */
#ifndef MIN_TOOL_VERSION_runghc
#define MIN_TOOL_VERSION_runghc(major1,major2,minor) (\
(major1) < 9 || \
(major1) == 9 && (major2) < 10 || \
(major1) == 9 && (major2) == 10 && (minor) <= 3)
#endif /* MIN_TOOL_VERSION_runghc */
/* tool strip-2.46 */
#ifndef TOOL_VERSION_strip
#define TOOL_VERSION_strip "2.46"
#endif /* TOOL_VERSION_strip */
#ifndef MIN_TOOL_VERSION_strip
#define MIN_TOOL_VERSION_strip(major1,major2,minor) (\
(major1) < 2 || \
(major1) == 2 && (major2) < 46 || \
(major1) == 2 && (major2) == 46 && (minor) <= 0)
#endif /* MIN_TOOL_VERSION_strip */
#ifndef CURRENT_COMPONENT_ID
#define CURRENT_COMPONENT_ID "lamb-0.1.0.0-inplace-lamb-tests"
#endif /* CURRENT_COMPONENT_ID */
#ifndef CURRENT_PACKAGE_VERSION
#define CURRENT_PACKAGE_VERSION "0.1.0.0"
#endif /* CURRENT_PACKAGE_VERSION */

View file

@ -0,0 +1,3 @@
Test suite lamb-tests: RUNNING...
Test suite lamb-tests: FAIL
Test suite logged to: /home/jingus/dev/lamb/./dist-newstyle/build/x86_64-linux/ghc-9.10.3/lamb-0.1.0.0/t/lamb-tests/test/lamb-0.1.0.0-lamb-tests.log

View file

@ -0,0 +1 @@
PackageLog {package = PackageIdentifier {pkgName = PackageName "lamb", pkgVersion = mkVersion [0,1,0,0]}, compiler = CompilerId GHC (mkVersion [9,10,3]), platform = Platform X86_64 Linux, testSuites = [TestSuiteLog {testSuiteName = UnqualComponentName "lamb-tests", testLogs = TestLog {testName = "lamb-tests", testOptionsReturned = [], testResult = Fail "exit code: 1"}, logFile = "/home/jingus/dev/lamb/./dist-newstyle/build/x86_64-linux/ghc-9.10.3/lamb-0.1.0.0/t/lamb-tests/test/lamb-0.1.0.0-lamb-tests.log"}]}

View file

@ -0,0 +1,46 @@
{-# LANGUAGE NoRebindableSyntax #-}
{-# OPTIONS_GHC -Wno-missing-import-lists #-}
{-# OPTIONS_GHC -w #-}
{-|
Module : PackageInfo_lamb
Description : Contents of some of the package's Cabal file's fields.
WARNING: This module was generated by Cabal. Any modifications will be
overwritten if the module is regenerated.
This module exports values that record information from some of the fields of
the package's Cabal package description file (Cabal file).
For further information about the fields in a Cabal file, see the Cabal User
Guide.
-}
module PackageInfo_lamb (
name,
version,
synopsis,
copyright,
homepage,
) where
import Data.Version (Version(..))
import Prelude
-- |The content of the @name@ field of the package's Cabal file, but with any
-- hyphen characters replaced by underscore characters.
name :: String
name = "lamb"
-- |The content of the @version@ field of the package's Cabal file.
version :: Version
version = Version [0,1,0,0] []
-- |The content of the @synopsis@ field of the package's Cabal file.
synopsis :: String
synopsis = ""
-- |The content of the @copyright@ field of the package's Cabal file.
copyright :: String
copyright = ""
-- |The content of the @homepage@ field of the package's Cabal file.
homepage :: String
homepage = ""

View file

@ -0,0 +1,132 @@
{-# LANGUAGE CPP #-}
{-# LANGUAGE NoRebindableSyntax #-}
#if __GLASGOW_HASKELL__ >= 810
{-# OPTIONS_GHC -Wno-prepositive-qualified-module #-}
#endif
{-# OPTIONS_GHC -Wno-missing-import-lists #-}
{-# OPTIONS_GHC -w #-}
{-|
Module : Paths_lamb
Description : Data file location, and package version and installation
directories.
WARNING: This module was generated by Cabal. Any modifications will be
overwritten if the module is regenerated.
This module exports a function to locate data files, and values that record
the version of the package and some directories which the package has been
configured to be installed into.
For further information about Cabal's options for its configuration step, and
their default values, see the Cabal User Guide.
-}
module Paths_lamb (
version,
getBinDir, getLibDir, getDynLibDir, getDataDir, getLibexecDir,
getDataFileName, getSysconfDir
) where
import qualified Control.Exception as Exception
import Data.Version (Version(..))
import System.Environment (getEnv)
import Prelude
#if defined(VERSION_base)
#if MIN_VERSION_base(4,0,0)
catchIO :: IO a -> (Exception.IOException -> IO a) -> IO a
#else
catchIO :: IO a -> (Exception.Exception -> IO a) -> IO a
#endif
#else
catchIO :: IO a -> (Exception.IOException -> IO a) -> IO a
#endif
catchIO = Exception.catch
-- |The package version.
version :: Version
version = Version [0,1,0,0] []
-- |If the argument is a filename, the result is the name of a corresponding
-- file on the system on which the program is running, if the file were listed
-- in the @data-files@ field of the package's Cabal package description file.
-- No check is performed that the given filename is listed in that field.
getDataFileName :: FilePath -> IO FilePath
getDataFileName name = do
dir <- getDataDir
return (dir `joinFileName` name)
-- |The location of the directory specified by Cabal's @--bindir@ option (where
-- executables that the user might invoke are installed). This can be overridden
-- at runtime using the environment variable lamb_bindir.
getBinDir :: IO FilePath
-- |The location of the directory specified by Cabal's @--libdir@ option (where
-- object libraries are installed). This can be overridden at runtime using the
-- environment variable lamb_libdir.
getLibDir :: IO FilePath
-- |The location of the directory specified by Cabal's @--dynlibdir@ option
-- (where dynamic libraries are installed). This can be overridden at runtime
-- using the environment variable lamb_dynlibdir.
getDynLibDir :: IO FilePath
-- |The location of the directory specified by Cabal's @--datadir@ option (where
-- architecture-independent data files are installed). This can be overridden at
-- runtime using the environment variable lamb_datadir.
getDataDir :: IO FilePath
-- |The location of the directory specified by Cabal's @--libexedir@ option
-- (where executables that are not expected to be invoked directly by the user
-- are installed). This can be overridden at runtime using the environment
-- variable lamb_libexedir.
getLibexecDir :: IO FilePath
-- |The location of the directory specified by Cabal's @--sysconfdir@ option
-- (where configuration files are installed). This can be overridden at runtime
-- using the environment variable lamb_sysconfdir.
getSysconfDir :: IO FilePath
bindir, libdir, dynlibdir, datadir, libexecdir, sysconfdir :: FilePath
bindir = "/home/jingus/.cabal/bin"
libdir = "/home/jingus/.cabal/lib/x86_64-linux-ghc-9.10.3-c0c3/lamb-0.1.0.0-inplace-lamb"
dynlibdir = "/home/jingus/.cabal/lib/x86_64-linux-ghc-9.10.3-c0c3"
datadir = "/home/jingus/.cabal/share/x86_64-linux-ghc-9.10.3-c0c3/lamb-0.1.0.0"
libexecdir = "/home/jingus/.cabal/libexec/x86_64-linux-ghc-9.10.3-c0c3/lamb-0.1.0.0"
sysconfdir = "/home/jingus/.cabal/etc"
getBinDir = catchIO (getEnv "lamb_bindir") (\_ -> return bindir)
getLibDir = catchIO (getEnv "lamb_libdir") (\_ -> return libdir)
getDynLibDir = catchIO (getEnv "lamb_dynlibdir") (\_ -> return dynlibdir)
getDataDir = catchIO (getEnv "lamb_datadir") (\_ -> return datadir)
getLibexecDir = catchIO (getEnv "lamb_libexecdir") (\_ -> return libexecdir)
getSysconfDir = catchIO (getEnv "lamb_sysconfdir") (\_ -> return sysconfdir)
joinFileName :: String -> String -> FilePath
joinFileName "" fname = fname
joinFileName "." fname = fname
joinFileName dir "" = dir
joinFileName dir@(c:cs) fname
| isPathSeparator (lastChar c cs) = dir ++ fname
| otherwise = dir ++ pathSeparator : fname
where
-- We do not use Data.List.NonEmpty.last, as that would limit the module to
-- base >= 4.9.0.0 (GHC >= 8.0.1).
lastChar x [] = x
lastChar _ (x:xs) = lastChar x xs
pathSeparator :: Char
pathSeparator = '/'
isPathSeparator :: Char -> Bool
isPathSeparator c = c == '/'

View file

@ -0,0 +1,140 @@
/* DO NOT EDIT: This file is automatically generated by Cabal */
/* package lamb-0.1.0.0 */
#ifndef VERSION_lamb
#define VERSION_lamb "0.1.0.0"
#endif /* VERSION_lamb */
#ifndef MIN_VERSION_lamb
#define MIN_VERSION_lamb(major1,major2,minor) (\
(major1) < 0 || \
(major1) == 0 && (major2) < 1 || \
(major1) == 0 && (major2) == 1 && (minor) <= 0)
#endif /* MIN_VERSION_lamb */
/* package base-4.20.2.0 */
#ifndef VERSION_base
#define VERSION_base "4.20.2.0"
#endif /* VERSION_base */
#ifndef MIN_VERSION_base
#define MIN_VERSION_base(major1,major2,minor) (\
(major1) < 4 || \
(major1) == 4 && (major2) < 20 || \
(major1) == 4 && (major2) == 20 && (minor) <= 2)
#endif /* MIN_VERSION_base */
/* tool cpphs-1.20.9 */
#ifndef TOOL_VERSION_cpphs
#define TOOL_VERSION_cpphs "1.20.9"
#endif /* TOOL_VERSION_cpphs */
#ifndef MIN_TOOL_VERSION_cpphs
#define MIN_TOOL_VERSION_cpphs(major1,major2,minor) (\
(major1) < 1 || \
(major1) == 1 && (major2) < 20 || \
(major1) == 1 && (major2) == 20 && (minor) <= 9)
#endif /* MIN_TOOL_VERSION_cpphs */
/* tool gcc-15.2.0 */
#ifndef TOOL_VERSION_gcc
#define TOOL_VERSION_gcc "15.2.0"
#endif /* TOOL_VERSION_gcc */
#ifndef MIN_TOOL_VERSION_gcc
#define MIN_TOOL_VERSION_gcc(major1,major2,minor) (\
(major1) < 15 || \
(major1) == 15 && (major2) < 2 || \
(major1) == 15 && (major2) == 2 && (minor) <= 0)
#endif /* MIN_TOOL_VERSION_gcc */
/* tool ghc-9.10.3 */
#ifndef TOOL_VERSION_ghc
#define TOOL_VERSION_ghc "9.10.3"
#endif /* TOOL_VERSION_ghc */
#ifndef MIN_TOOL_VERSION_ghc
#define MIN_TOOL_VERSION_ghc(major1,major2,minor) (\
(major1) < 9 || \
(major1) == 9 && (major2) < 10 || \
(major1) == 9 && (major2) == 10 && (minor) <= 3)
#endif /* MIN_TOOL_VERSION_ghc */
/* tool ghc-pkg-9.10.3 */
#ifndef TOOL_VERSION_ghc_pkg
#define TOOL_VERSION_ghc_pkg "9.10.3"
#endif /* TOOL_VERSION_ghc_pkg */
#ifndef MIN_TOOL_VERSION_ghc_pkg
#define MIN_TOOL_VERSION_ghc_pkg(major1,major2,minor) (\
(major1) < 9 || \
(major1) == 9 && (major2) < 10 || \
(major1) == 9 && (major2) == 10 && (minor) <= 3)
#endif /* MIN_TOOL_VERSION_ghc_pkg */
/* tool gpp-15.2.0 */
#ifndef TOOL_VERSION_gpp
#define TOOL_VERSION_gpp "15.2.0"
#endif /* TOOL_VERSION_gpp */
#ifndef MIN_TOOL_VERSION_gpp
#define MIN_TOOL_VERSION_gpp(major1,major2,minor) (\
(major1) < 15 || \
(major1) == 15 && (major2) < 2 || \
(major1) == 15 && (major2) == 2 && (minor) <= 0)
#endif /* MIN_TOOL_VERSION_gpp */
/* tool haddock-2.31.1 */
#ifndef TOOL_VERSION_haddock
#define TOOL_VERSION_haddock "2.31.1"
#endif /* TOOL_VERSION_haddock */
#ifndef MIN_TOOL_VERSION_haddock
#define MIN_TOOL_VERSION_haddock(major1,major2,minor) (\
(major1) < 2 || \
(major1) == 2 && (major2) < 31 || \
(major1) == 2 && (major2) == 31 && (minor) <= 1)
#endif /* MIN_TOOL_VERSION_haddock */
/* tool hpc-0.69 */
#ifndef TOOL_VERSION_hpc
#define TOOL_VERSION_hpc "0.69"
#endif /* TOOL_VERSION_hpc */
#ifndef MIN_TOOL_VERSION_hpc
#define MIN_TOOL_VERSION_hpc(major1,major2,minor) (\
(major1) < 0 || \
(major1) == 0 && (major2) < 69 || \
(major1) == 0 && (major2) == 69 && (minor) <= 0)
#endif /* MIN_TOOL_VERSION_hpc */
/* tool hsc2hs-0.68.10 */
#ifndef TOOL_VERSION_hsc2hs
#define TOOL_VERSION_hsc2hs "0.68.10"
#endif /* TOOL_VERSION_hsc2hs */
#ifndef MIN_TOOL_VERSION_hsc2hs
#define MIN_TOOL_VERSION_hsc2hs(major1,major2,minor) (\
(major1) < 0 || \
(major1) == 0 && (major2) < 68 || \
(major1) == 0 && (major2) == 68 && (minor) <= 10)
#endif /* MIN_TOOL_VERSION_hsc2hs */
/* tool hscolour-1.25 */
#ifndef TOOL_VERSION_hscolour
#define TOOL_VERSION_hscolour "1.25"
#endif /* TOOL_VERSION_hscolour */
#ifndef MIN_TOOL_VERSION_hscolour
#define MIN_TOOL_VERSION_hscolour(major1,major2,minor) (\
(major1) < 1 || \
(major1) == 1 && (major2) < 25 || \
(major1) == 1 && (major2) == 25 && (minor) <= 0)
#endif /* MIN_TOOL_VERSION_hscolour */
/* tool runghc-9.10.3 */
#ifndef TOOL_VERSION_runghc
#define TOOL_VERSION_runghc "9.10.3"
#endif /* TOOL_VERSION_runghc */
#ifndef MIN_TOOL_VERSION_runghc
#define MIN_TOOL_VERSION_runghc(major1,major2,minor) (\
(major1) < 9 || \
(major1) == 9 && (major2) < 10 || \
(major1) == 9 && (major2) == 10 && (minor) <= 3)
#endif /* MIN_TOOL_VERSION_runghc */
/* tool strip-2.46 */
#ifndef TOOL_VERSION_strip
#define TOOL_VERSION_strip "2.46"
#endif /* TOOL_VERSION_strip */
#ifndef MIN_TOOL_VERSION_strip
#define MIN_TOOL_VERSION_strip(major1,major2,minor) (\
(major1) < 2 || \
(major1) == 2 && (major2) < 46 || \
(major1) == 2 && (major2) == 46 && (minor) <= 0)
#endif /* MIN_TOOL_VERSION_strip */
#ifndef CURRENT_COMPONENT_ID
#define CURRENT_COMPONENT_ID "lamb-0.1.0.0-inplace-lamb"
#endif /* CURRENT_COMPONENT_ID */
#ifndef CURRENT_PACKAGE_VERSION
#define CURRENT_PACKAGE_VERSION "0.1.0.0"
#endif /* CURRENT_PACKAGE_VERSION */

BIN
dist-newstyle/cache/compiler vendored Normal file

Binary file not shown.

BIN
dist-newstyle/cache/config vendored Normal file

Binary file not shown.

BIN
dist-newstyle/cache/elaborated-plan vendored Normal file

Binary file not shown.

BIN
dist-newstyle/cache/improved-plan vendored Normal file

Binary file not shown.

1
dist-newstyle/cache/plan.json vendored Normal file

File diff suppressed because one or more lines are too long

BIN
dist-newstyle/cache/solver-plan vendored Normal file

Binary file not shown.

BIN
dist-newstyle/cache/source-hashes vendored Normal file

Binary file not shown.

BIN
dist-newstyle/cache/up-to-date vendored Normal file

Binary file not shown.

Binary file not shown.

77
flake.lock generated Normal file
View file

@ -0,0 +1,77 @@
{
"nodes": {
"flake-parts": {
"inputs": {
"nixpkgs-lib": "nixpkgs-lib"
},
"locked": {
"lastModified": 1777988971,
"narHash": "sha256-qIoWPDs+0/8JecyYgE3gpKQxW/4bLW/gp45vow9ioCQ=",
"owner": "hercules-ci",
"repo": "flake-parts",
"rev": "0678d8986be1661af6bb555f3489f2fdfc31f6ff",
"type": "github"
},
"original": {
"owner": "hercules-ci",
"repo": "flake-parts",
"type": "github"
}
},
"haskell-flake": {
"locked": {
"lastModified": 1777906944,
"narHash": "sha256-RGc78WXyHT+m3yoVydNDBwaleTWKp1mctBtS8fmyOSo=",
"owner": "srid",
"repo": "haskell-flake",
"rev": "b24a8a95ba7364a3aa6e53c35ad36ec33bd02fff",
"type": "github"
},
"original": {
"owner": "srid",
"repo": "haskell-flake",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1778274207,
"narHash": "sha256-I4puXmX1iovcCHZlRmztO3vW0mAbbRvq4F8wgIMQ1MM=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "b3da656039dc7a6240f27b2ef8cc6a3ef3bccae7",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "nixpkgs-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs-lib": {
"locked": {
"lastModified": 1777168982,
"narHash": "sha256-GOkGPcboWE9BmGCRMLX3worL4EMnsnG8MyKmXNeYuhQ=",
"owner": "nix-community",
"repo": "nixpkgs.lib",
"rev": "f5901329dade4a6ea039af1433fb087bd9c1fe14",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "nixpkgs.lib",
"type": "github"
}
},
"root": {
"inputs": {
"flake-parts": "flake-parts",
"haskell-flake": "haskell-flake",
"nixpkgs": "nixpkgs"
}
}
},
"root": "root",
"version": 7
}

58
flake.nix Normal file
View file

@ -0,0 +1,58 @@
{
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
flake-parts.url = "github:hercules-ci/flake-parts";
haskell-flake.url = "github:srid/haskell-flake";
};
outputs = inputs@{ self, nixpkgs, flake-parts, ... }:
flake-parts.lib.mkFlake { inherit inputs; } {
systems = nixpkgs.lib.systems.flakeExposed;
imports = [ inputs.haskell-flake.flakeModule ];
perSystem = { self', pkgs, ... }: {
# Typically, you just want a single project named "default". But
# multiple projects are also possible, each using different GHC version.
haskellProjects.default = {
# The base package set representing a specific GHC version.
# By default, this is pkgs.haskellPackages.
# You may also create your own. See https://haskell.nixos.asia/package-set
# basePackages = pkgs.haskellPackages;
# Extra package information. See https://haskell.nixos.asia/dependency
#
# Note that local packages are automatically included in `packages`
# (defined by `defaults.packages` option).
#
packages = {
# aeson.source = "1.5.0.0"; # Override aeson to a custom version from Hackage
# shower.source = inputs.shower; # Override shower to a custom source path
};
settings = {
# aeson = {
# check = false;
# };
# relude = {
# haddock = false;
# broken = false;
# };
};
devShell = {
# Enabled by default
# enable = true;
# Programs you want to make available in the shell.
# Default programs can be disabled by setting to 'null'
# tools = hp: { fourmolu = hp.fourmolu; ghcid = null; };
# Check that haskell-language-server works
# hlsCheck.enable = true; # Requires sandbox to be disabled
};
};
# haskell-flake doesn't set the default package, but you can do it here.
packages.default = self'.packages.lamb;
};
};
}

31
lamb.cabal Normal file
View file

@ -0,0 +1,31 @@
cabal-version: 3.0
name: lamb
version: 0.1.0.0
license: NONE
author: jingus
maintainer: jack@jingus.dev
build-type: Simple
common warnings
ghc-options: -Wall
executable lamb
import: warnings
main-is: Main.hs
other-modules: Parser,
Evaluation
build-depends: base
hs-source-dirs: src
default-language: Haskell2010
test-suite lamb-tests
type: exitcode-stdio-1.0
main-is: Spec.hs
hs-source-dirs: src, test
other-modules: Parser,
ParserSpec,
Evaluation,
EvaluationSpec
build-depends: base, hspec
build-tool-depends: hspec-discover:hspec-discover
default-language: Haskell2010

6
src/Evaluation.hs Normal file
View file

@ -0,0 +1,6 @@
module Evaluation where
import Parser (Expr (Variable))
run :: Expr -> Expr
run _ = Variable "a"

19
src/Main.hs Normal file
View file

@ -0,0 +1,19 @@
module Main where
import Evaluation (run)
import Parser (parse)
import System.Environment (getArgs)
import System.IO (IOMode (ReadMode), hGetContents, openFile)
main :: IO ()
main = do
args <- getArgs
let command = args !! 0
let path = args !! 1
case command of
"run" -> do
content <- openFile path ReadMode >>= hGetContents
either putStrLn putStrLn $ show . run <$> parse content
_ -> putStrLn $ "Unrecognized command: " ++ command

12
src/Parser.hs Normal file
View file

@ -0,0 +1,12 @@
module Parser where
data Expr = Variable String | Abstraction (String, Expr) | Application (Expr, Expr)
deriving (Eq)
instance Show Expr where
show (Variable name) = name
show (Abstraction (arg, body)) = "λ" ++ arg ++ ". " ++ show body
show (Application (f, x)) = show f ++ " " ++ show x
parse :: String -> Either String Expr
parse _ = Left "unimplemented"

8
test/EvaluationSpec.hs Normal file
View file

@ -0,0 +1,8 @@
module EvaluationSpec (spec) where
import Test.Hspec
spec :: Spec
spec = do
describe "Evaluation" $ do
it "can evaluation expressions" $
True `shouldBe` True

10
test/ParserSpec.hs Normal file
View file

@ -0,0 +1,10 @@
module ParserSpec (spec) where
import Parser (Expr (Abstraction, Variable), parse)
import Test.Hspec
spec :: Spec
spec = do
describe "Parser" $ do
it "can parse basic expressions" $
(parse "λx.x") `shouldBe` Right (Abstraction ("x", Variable "x"))

1
test/Spec.hs Normal file
View file

@ -0,0 +1 @@
{-# OPTIONS_GHC -F -pgmF hspec-discover #-}